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.