完全なトレースを非常に注意深く検査する必要があります。
サーバー ソケット アプリケーションがあり、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
、クライアントが my に接続し、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
継続して取得しているときに、このスナップショットを取得しました。
