完全なトレースを非常に注意深く検査する必要があります。
サーバーソケットアプリケーションを使用して、java.net.SocketException: Connection reset
ケースを修正しました。
私の場合Socket
、なんらかの理由で接続が閉じられているclientSocket オブジェクトからの読み取り中に発生します。(ネットワークが失われた、ファイアウォールまたはアプリケーションがクラッシュした、または意図的に終了した)
実際、このSocketオブジェクトからの読み取り中にエラーが発生したときに、接続を再確立していました。
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
興味深いのはfor my JAVA Socket
、クライアントが自分に接続し、ServerSocket
何もis.read()
呼び出しを再帰的に送信せずに接続を閉じる場合です。これは、このソケットから読み取るために無限のwhileループにいるため、閉じた接続から読み取ろうとしているようです。読み取り操作に以下のようなものを使用すると、
while(true)
{
Receive();
}
次に、以下のようなstackTraceを何度も取得します
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
私がしたことは、ServerSocketを閉じて接続を更新し、さらにクライアントからの接続を待機することです。
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
これにより、不明なクライアントソケットが失われた場合の接続が再確立されます
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...
}
}
下の画像からわかるように、接続が失われたかどうかを理解できないのはtry and catch
、すべてが正しいように見えるためです。Connection reset
継続的に取得しているときに、このスナップショットを取得しました。