さまざまなSOの回答について、いくつかの混乱と矛盾するステートメントがあるようです。java.net.SocketExceptionの原因は何ですか:接続がリセットされましたか?。ここで、受け入れられた回答が、接続が反対側によって閉じられたことを示していることがわかります。ただし、これは正しくありません。接続を閉じても接続はリセットされません。これは、「根本的なTCP/IPエラー」が原因です。
私が知りたいのはSocketException: Connection reset
、「TCP/IPエラーの異常」以外の手段があるかどうかです。何が本当にこれを引き起こしますか?接続が閉じられていることとは関係がないのではないかと思います(接続を閉じることは例外に値するフラグではなく、閉じられた接続から読み取ることは例外ですが、それは「根本的なTCP/IPエラー」ではないためです。
私の仮説はこれです
接続のリセットは、サーバーがACKパケットを確認できなかったことが原因で発生します(TCP / IPに従って、完全にまたは単に不適切に)。また、SocketTimeoutExceptionは、読み取るデータが生成されない場合にのみ生成されます(これは、一定期間後の読み取り中にスローされ、読み取りはデータを待機していますが、ACKパケットには関係しないため)。つまり、read()は、割り当てられた時間内に実際のデータ(DATA LAYER)のバイトを読み取らなかった場合、SocketTimeoutExceptionをスローします。