Saltar al contenido

sockets – java.net.SocketException: restablecimiento de la conexión

octubre 16, 2021
apple touch icon@2

Debe inspeccionar el rastro completo con mucho cuidado,

Tengo una aplicación de socket de servidor y arreglé un java.net.SocketException: Connection reset caso.

En mi caso sucede mientras leo de un clientSocket Socket objeto que ha cerrado su conexión por alguna razón. (Red perdida, firewall o falla de la aplicación o cierre previsto)

En realidad, estaba restableciendo la conexión cuando recibí un error al leer este objeto Socket.

Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!

Lo interesante es for my JAVA Socket si un cliente se conecta a mi ServerSocket y cierra su conexión sin enviar nada is.read() está siendo llamado repetidamente Parece que debido a que está en un bucle infinito while para leer desde este socket, intenta leer desde una conexión cerrada. Si usa algo como el siguiente para la operación de lectura;

while(true)
{
  Receive();
}

Luego obtienes una pila Traza algo como a continuación una y otra vez

java.net.SocketException: Socket is closed
    at java.net.ServerSocket.accept(ServerSocket.java:494)

Lo que hice fue cerrar ServerSocket y renovar mi conexión y esperar más conexiones de cliente entrantes

String Receive() throws Exception
{
try {                   
            int readed = is.read();
           ....
}catch(Exception e)
{
        tryReConnect();
        logit(); //etc
}


//...
}

Esto restablece mi conexión para pérdidas de socket de cliente desconocidas

private void tryReConnect()
        {
            try
            {
                ServerSocket.close();
                //empty my old lost connection and let it get by garbage col. immediately 
                clientSocket=null;
                System.gc();
                //Wait a new client Socket connection and address this to my local variable
                clientSocket= ServerSocket.accept(); // Waiting for another Connection
                System.out.println("Connection established...");
            }catch (Exception e) {
                String message="ReConnect not successful "+e.getMessage();
                logit();//etc...
            }
        }

No pude encontrar otra manera porque, como puede ver en la imagen de abajo, no puede entender si la conexión se pierde o no sin un try and catch , porque todo parece correcto. Obtuve esta instantánea mientras obtenía Connection reset continuamente.

ingrese la descripción de la imagen aquí

close