Powinieneś bardzo dokładnie sprawdzić pełny ślad,
Mam aplikację używającą gniazda serwera i naprawiłem java.net.SocketException: Connection reset
przypadek.
W moim przypadku dzieje się tak podczas odczytu z Socket
obiektu clientSocket, który z jakiegoś powodu zamyka swoje połączenie. (Utrata sieci, awaria zapory lub aplikacji albo zamierzone zamknięcie)
Właściwie to przywracałem połączenie, gdy wystąpił błąd podczas odczytu z tego obiektu Socket.
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
Ciekawostką jest to, for my JAVA Socket
że jeśli klient łączy się z my ServerSocket
i zamyka swoje połączenie bez wysyłania jakichkolwiek is.read()
wywołań rekurencyjnych, wydaje się, że będąc w nieskończonej pętli while do odczytu z tego gniazda, próbujesz odczytać z zamkniętego połączenia. Jeśli używasz czegoś takiego jak poniżej do operacji odczytu;
while(true)
{
Receive();
}
Następnie dostajesz stos i śledzenie czegoś takiego jak poniżej
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
Po prostu zamknąłem ServerSocket i odnowiłem połączenie i czekałem na dalsze przychodzące połączenia klientów
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
Spowoduje to ponowne nawiązanie połączenia w przypadku utraty nieznanego gniazda klienta
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...
}
}
Nie mogłem znaleźć innego sposobu, ponieważ jak widać na poniższym obrazku, nie możesz zrozumieć, czy połączenie jest utracone, czy nie bez a try and catch
, ponieważ wszystko wydaje się w porządku. Otrzymałem tę migawkę podczas Connection reset
ciągłego otrzymywania .