2

さまざまなSOの回答について、いくつかの混乱と矛盾するステートメントがあるようです。java.net.SocketExceptionの原因は何ですか:接続がリセットされましたか?。ここで、受け入れられた回答が、接続が反対側によって閉じられたことを示していることがわかります。ただし、これは正しくありません。接続を閉じても接続はリセットされません。これは、「根本的なTCP/IPエラー」が原因です。

私が知りたいのはSocketException: Connection reset、「TCP/IPエラーの異常」以外の手段があるかどうかです。何が本当にこれを引き起こしますか?接続が閉じられていることとは関係がないのではないかと思います(接続を閉じることは例外に値するフラグではなく、閉じられた接続から読み取ることは例外ですが、それは「根本的なTCP/IPエラー」ではないためです。

私の仮説はこれです

接続のリセットは、サーバーがACKパケットを確認できなかったことが原因で発生します(TCP / IPに従って、完全にまたは単に不適切に)。また、SocketTimeoutExceptionは、読み取るデータが生成されない場合にのみ生成れます(これは、一定期間後の読み取り中にスローされ、読み取りはデータを待機していますが、ACKパケットには関係しないため)。つまり、read()は、割り当てられた時間内に実際のデータ(DATA LAYER)のバイトを読み取らなかった場合、SocketTimeoutExceptionをスローします。

4

2 に答える 2

1

openjdk6のソースから、ECONNRESETエラー(LinuxおよびSolaris)またはWSAECONNRESET(Windows)でデータの読み取りに失敗すると、「接続リセット」が発行されるようです。

私の経験では、典型的な原因は、ソケットの反対側のパーティが最初にシャットダウンを実行せずにソケットを閉じたことです。

于 2010-04-22T22:33:07.410 に答える
1

私の経験では、クライアントがリクエストを中止したときに発生します(ユーザーがタブを閉じるか、別のリンクをクリックした)。

于 2010-04-22T15:51:21.487 に答える