あなたは、私はサーバソケットアプリケーションをしたとjava.net.SocketException: Connection reset
ケースを固定し、非常に慎重に
を完全なトレースを検査する必要があります。
私のケースでは、何らかの理由で接続が閉じられたclientSocket Socket
オブジェクトからの読み取り中に発生します。 (ネットワークの紛失、ファイアウォールまたはアプリケーションのクラッシュまたは意図した終了)
実際には、このソケットオブジェクトからの読み取り中にエラーが発生したときに接続を再確立していました。
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
無限であることのこのソケットからの読み取りのためにあなたが読んしようとwhileループため、クライアントが私ServerSocket
と思わrecursively.It自分自身を呼び出すis.read()
何も送信せずにその接続を閉じるに接続する場合興味深いのは、for my JAVA Socket
です閉じた接続から。 読み取り操作に以下のようなものを使用すると、その後
while(true)
{
Receive();
}
あなたは以下のように、私はただのServerSocketを閉じて私の接続を更新し、さらに着信クライアント接続
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
を待っていた何
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
にスタックトレースの何かを得ますこれにより、未知のクライアントソケットの紛失に対する私の接続が再確立されます
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
を連続して得ている間にこのスナップショットを手に入れました。
両側にスタックトレースがありますか?ネットワークアーキテクチャについてもう少し説明できますか? (野生のインターネット上で、同じマシンで、どこかのどこかに)?それはいつも起こっていますか?または断続的に? –