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":
 . 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": . Probare creando un socket remoto y local.
 . Probare creando un socket remoto y local.