Dovresti ispezionare la traccia completa con molta attenzione,
Ho un'applicazione socket del server e ho risolto un java.net.SocketException: Connection reset
caso.
Nel mio caso accade durante la lettura da un Socket
oggetto clientSocket che ha chiuso la sua connessione per qualche motivo. (Rete persa, firewall o arresto anomalo dell'applicazione o chiusura intenzionale)
In realtà stavo ristabilendo la connessione quando ho ricevuto un errore durante la lettura da questo oggetto Socket.
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
La cosa interessante è che for my JAVA Socket
se un client si connette a my ServerSocket
e chiude la sua connessione senza inviare nulla is.read()
chiama se stesso in modo ricorsivo. Sembra che a causa di un ciclo while infinito per la lettura da questo socket provi a leggere da una connessione chiusa. Se usi qualcosa di simile sotto per l'operazione di lettura;
while(true)
{
Receive();
}
Quindi ottieni uno stackTrace qualcosa come di seguito avanti e indietro
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
Quello che ho fatto è stato semplicemente chiudere ServerSocket e rinnovare la mia connessione e attendere ulteriori connessioni client in arrivo
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
Ciò ristabilisce la mia connessione per le perdite di socket client sconosciute
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...
}
}
Non sono riuscito a trovare un altro modo perché come vedi dall'immagine sotto non puoi capire se la connessione è persa o meno senza un try and catch
, perché tutto sembra a posto. Ho ottenuto questa istantanea mentre stavo ottenendo Connection reset
continuamente.