java.net.SocketException: 接続がリセットされました 質問する

java.net.SocketException: 接続がリセットされました 質問する

ソケットから読み取ろうとすると、次のエラーが発生します。readInt()これに対して を実行していますInputStreamが、このエラーが発生します。 ドキュメントを精査すると、接続のクライアント側が接続を閉じたようです。 このシナリオでは、私がサーバーです。

クライアント ログ ファイルにアクセスしましたが、接続は閉じられておらず、ログ ファイルには接続が閉じられていることが示されています。なぜこのようなことが起こるのか、誰かわかる方はいらっしゃいますか? 他に確認すべきことはありますか? これは、ローカル リソースがしきい値に達している可能性がある場合に発生しますか?


次の行があることに気付きました:

socket.setSoTimeout(10000);

の直前ですreadInt()。これには理由があります (長い話です) が、単に興味があるのですが、これが示されたエラーにつながる可能性がある状況はありますか? IDE でサーバーを実行しており、IDE がブレークポイントでスタックしたままになったところ、IDE の自分のログにまったく同じエラーが表示され始めたことに気付きました。

とにかく、ただ言及しただけですが、誤解を招くような内容ではないことを願います。

ベストアンサー1

考えられる原因はいくつかあります。

  1. 相手側は意図的に接続をリセットしましたが、その方法についてはここでは説明しません。アプリケーション ソフトウェアがこれを行うのはまれであり、通常は誤りですが、商用ソフトウェアでは珍しいことではありません。

  2. より一般的には、相手側がすでに正常に閉じている接続に書き込むことによって発生します。つまり、アプリケーション プロトコル エラーです。

  3. また、ソケット受信バッファに未読データがあるときにソケットを閉じることによっても発生する可能性があります。

  4. Windows では、「ソフトウェアによる接続中断」は「接続リセット」とは異なり、ユーザー側からの送信におけるネットワークの問題によって発生します。これについては、Microsoft のナレッジ ベースの記事があります。

  5. Windows では、ソケットを閉じずにプロセスが存在する場合、接続がリセットされますが、Unix、Linux などではそうではありません。他の OS では、ソケットが適切に閉じられます。

おすすめ記事