Hola gente, buenos tardes
Tengo una aplicancion cliente/servidor bastante simple. Lo que quiero hacer es un programa que este entre medio de los dos, por lo tanto los mensajes del cliente van a mi programa, y lo salientes al server y viceversa. El programa funciona bien, pero quiero que sea en contra de fallos del cliente/servidor (timeouts/desconexiones,etc). El caso que no estoy pudiendo resolver es el siguiente:
1.- Se recibe un mensaje del cliente y se lo envia al servidor, el servidor responde y le envio ese mensaje al cliente correctamente
2.- Ambas aplicaciones (cliente y servidor) se encuentran conectadas a mi programa
3.- Apago el servidor
4.- El cliente envia un mensaje, se lo paso al servidor y me da timeout
5.- El servidor revive
6.- Probamos el punto 1 de vuelta pero parece que mi programa no le puede entregar ahora el mensaje al servidor y no puede reconectarse adecuadamente
Este es el codigo, alguna idea que puede ser?
Tengo una aplicancion cliente/servidor bastante simple. Lo que quiero hacer es un programa que este entre medio de los dos, por lo tanto los mensajes del cliente van a mi programa, y lo salientes al server y viceversa. El programa funciona bien, pero quiero que sea en contra de fallos del cliente/servidor (timeouts/desconexiones,etc). El caso que no estoy pudiendo resolver es el siguiente:
1.- Se recibe un mensaje del cliente y se lo envia al servidor, el servidor responde y le envio ese mensaje al cliente correctamente
2.- Ambas aplicaciones (cliente y servidor) se encuentran conectadas a mi programa
3.- Apago el servidor
4.- El cliente envia un mensaje, se lo paso al servidor y me da timeout
5.- El servidor revive
6.- Probamos el punto 1 de vuelta pero parece que mi programa no le puede entregar ahora el mensaje al servidor y no puede reconectarse adecuadamente
Este es el codigo, alguna idea que puede ser?
Código [Seleccionar]
package interceptorprocess;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
public class GenericInterceptorProcess implements Runnable
{
private final String prefix_log_messages = "[CONNECTOR]";
//COMMUNICATION'S ORIGIN'S VARIABLES
ServerSocket serverSocketLocal;
Socket socketForLocal;
DataInputStream streamFromOrigin;
DataOutputStream streamToOrigen;
int len_message_from_origen;
byte[] buffer_msg_origin = new byte[4096];
byte[] message_origin = null;
//COMMUNICATION'S DESTINY'S VARIABLES
Socket socketToDestiny;
DataInputStream streamFromDestiny;
DataOutputStream streamToDestiny;
int len_message_from_destiny;
byte[] buffer_msg_destiny = new byte[4096];
byte[] message_destiny;
@Override
public void run()
{
//OCCASIONAL USE
String aux;
try
{
logger("STARTING SERVER --- PORT NUMBER: " + "1234");
//CREATING THE LOCAL SERVER SOCKET
serverSocketLocal = new ServerSocket(1234);
//CREATING THE DESTINITY CONNECTION WITH 15 TIMEOUT'S SECONDS
socketToDestiny = new Socket();
socketToDestiny.setSoTimeout(15000);
//THIS LOOP MAINTAINS THE CONNECTIVITY WITH ONE CLIENT AT TIME
while ( true )
{
logger("WAITING FOR A CONNECTION OF A CLIENT...");
socketForLocal = serverSocketLocal.accept();
//CREATING THE ORIGIN'S STREAMS
streamFromOrigin = new DataInputStream(socketForLocal.getInputStream());
streamToOrigen = new DataOutputStream(socketForLocal.getOutputStream());
logger("CONNECTED CLIENT: " + socketForLocal.getRemoteSocketAddress() );
//THIS LOOP MAINTAINS THE MESSAGES'S CHANGES
while ( true )
{
logger("WAITING FOR A MESSAGE..");
len_message_from_origen = streamFromOrigin.read(buffer_msg_origin);
if ( len_message_from_origen < 0 )
{
closeOriginStream();
break;
}
message_origin = new byte[len_message_from_origen];
//SAVE THE ORIGIN'S MESSAGE INTO AN ARRAY WHO HAS THE EXACT SIZE OF THIS MESSAGE
System.arraycopy(buffer_msg_origin, 0, message_origin, 0, len_message_from_origen);
aux = new String(message_origin);
logger("RECEIVED MESSAGE FROM ORIGIN: " + aux);
//TRY TO CONNECT TO DESTINY
try
{
if ( !socketToDestiny.isConnected() )
socketToDestiny.connect(new InetSocketAddress("10.10.200.200",1234),5000);
}
catch(IOException ex)
{
logger("CONNECTION REJECTED BY DESTINY: " + ex.getMessage());
continue;
}
//CREATING THE DESTINY'S STREAMS
streamFromDestiny = new DataInputStream(socketToDestiny.getInputStream());
streamToDestiny = new DataOutputStream(socketToDestiny.getOutputStream());
logger("SENDING MESSAGE TO DESTINY: " + aux);
//I HAD TO PUT THIS BLOCK BECAUSE IF THE DESTINY APPLICATIONS FAILS
//OR NOT ANSWER, THE PROGRAM MUST KEEP LISTENING THE FOLLOWING MESSAGES
try
{
//SENDING MESSAGE TO DESTINY
streamToDestiny.write(message_origin);
//READING THE ANSWER MESSAGE
logger("READING MESSAGE FROM DESTINY...");
len_message_from_destiny = streamFromDestiny.read(buffer_msg_destiny);
}
//IN ONE OF THE FOLLOWINGS TWO CATCHS I GET THE ERROR
catch (SocketTimeoutException ex)
{
logger("IT DIDN'T COULD RETRIEVE A MESSAGE FROM DESTINY: " + ex.getMessage());
continue;
}
catch (SocketException ex)
{
//THE "socketToDestiny.isConnected()" ALWAYS RETURNS TRUE SINCE THE FIRST SUCCESSFULLY
//CONNECTION, AFTER THAT, IF THE SOCKET IS DISCONNECTED, IT REMAINS RETURNING "true".
//THUS, I HAD TO MAKE THE NEXT CODE BLOCK
socketToDestiny.close();
socketToDestiny = new Socket();
logger("TRYING TO RECONNECT WITH DESTINY AND SEND THE MESSAGE... ");
socketToDestiny.connect(new InetSocketAddress(confs.destiny_ip,confs.destiny_port),confs.timeout_connections);
logger("READING MESSAGE FROM DESTINY AFTER ERROR...");
len_message_from_destiny = streamFromDestiny.read(buffer_msg_destiny);
}
message_destiny = new byte[len_message_from_destiny];
//SAVE THE DESTINY'S MESSAGE INTO AN ARRAY WHO HAS THE EXACT SIZE OF THIS MESSAGE
System.arraycopy(buffer_msg_destiny, 0, message_destiny, 0, len_message_from_destiny);
aux = new String(message_destiny);
logger("RECEIVED MESSAGE FROM DESTINY " + aux);
//SENDING THE ANSWER BACK TO THE ORIGIN
logger("SENDING BACK THE MESSAGE TO ORIGIN...");
streamToOrigen.write(message_destiny);
logger("MESSAGE DELIVERED SUCCESSFULLY!");
} //INTERNAL LOOP OF MESSAGES
} //INTERNAL LOOP OF CLIENTS
} //TRY
catch(IOException ex )
{
logger("THE SERVICE DIED: " + ex.getMessage() );
ex.printStackTrace();
} //CATCH
} //RUN
private void closeDestinyStream() throws IOException
{
streamFromDestiny.close();
streamToDestiny.close();
}
private void closeOriginStream() throws IOException
{
streamFromOrigin.close();
streamToOrigen.close();
}
private void closeAll() throws IOException
{
closeDestinyStream();
closeOriginStream();
}
private void logger(String message)
{
System.out.println(Utilidades.date() + " " + prefix_log_messages + " " + message);
}
}
. Les comento, vengo trabajando con C++ y unos archivos de datos de una aplicación externa un tanto engorrosos de trabajar, pero al fin uno se arregla. Cada linea de estos archivos de datos puede tratarse como un registro de una base de datos. El método que me trae el registro en C++ me lo deja cargado en un "char[XXX]" donde XXX es la cantidad de bytes. Por un lado yo tengo, a modo ejemplo, el siguiente "struct":
. Y empezar hacer mis propios cheats tambien en C++.
. Alguien podria indicarme algun PDF para empezar a programar y que emulador necesito?. Elijo esta plataforma porque me parece que es la que mas mercado tiene. Estuve investigando en internet, pero hay mucha sobreinformacion y me confunde :S. Capaz que alguien la tiene clara aca y me puede asesorar mejor
.
. Alguna idea como hacerlo. Por favor necesito que me quede de esta manera, ya se que es al pedo hacer esto pero necesito que al abrirlo con el Notepad++ se vea como describo al principio.