Sie sollten die gesamte Spur sehr sorgfältig prüfen.
Ich habe eine Server-Socket-Anwendung und einen java.net.SocketException: Connection reset
Fall behoben .
In meinem Fall geschieht dies beim Lesen von einem clientSocket- Socket
Objekt, dessen Verbindung aus irgendeinem Grund geschlossen wird. (Netzwerk verloren, Firewall oder Anwendung stürzt ab oder soll geschlossen werden)
Eigentlich stellte ich die Verbindung wieder her, als beim Lesen von diesem Socket-Objekt ein Fehler auftrat.
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
Das Interessante ist, for my JAVA Socket
wenn ein Client eine Verbindung zu my herstellt ServerSocket
und seine Verbindung schließt, ohne dass sich irgendetwas is.read()
rekursiv anruft. Es scheint, dass Sie versuchen, aus einer geschlossenen Verbindung zu lesen, weil Sie sich in einer Endlosschleife zum Lesen von diesem Socket befinden. Wenn Sie für den Lesevorgang etwas wie das Folgende verwenden;
while(true)
{
Receive();
}
Dann bekommst du eine stackTrace wie unten weiter und weiter
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
Ich habe nur ServerSocket geschlossen, meine Verbindung erneuert und auf weitere eingehende Clientverbindungen gewartet
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
Dadurch wird meine Verbindung für unbekannte Client-Socket-Verluste wiederhergestellt
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...
}
}
Ich konnte keinen anderen Weg finden, weil Sie, wie Sie auf dem Bild unten sehen, nicht verstehen können, ob die Verbindung ohne a unterbrochen ist oder nicht try and catch
, weil alles richtig zu sein scheint. Ich habe diesen Schnappschuss bekommen, während ich Connection reset
ununterbrochen war.