2016-04-28 14 views
0

Selectorsocketsを受け入れ、それを他のスレッドが処理するためのキューにプッシュしていて、スレッドがソケットを受け取っていない(たとえば2分)と、クライアントがデータをプッシュしてからタイムアウトして切断します。 threadが現在閉鎖しているものの1つをsocketsに取り込み、そこから読み取ろうとすると、すでにクライアントから送信されたデータが取得されるのでしょうか、それとも読み取るデータはありませんか?バイトが読み込まれる前に接続が切断された場合、TCPソケット接続上のバイトは失われますか?

+3

閉じたソケットから読み取ることはできません。 – Berger

答えて

1

「切断された」という意味に依存します。

  • 自分でソケットを閉じた場合、さまざまなread()メソッドからSocketException: socket closedが得られます。
  • ピアによって正常に接続が閉じられた場合、ストリームの終わりが通知される前にすべての保留データが読み取られます。
  • 接続が強制的にリセットされた場合、保留中のデータはすべて失われます。
+0

よろしくお願いします。私は2番目が私のサーバー上で見ていると思います。 「中断したリセット」が何を意味するのかを明確にすることはできますか? –

+1

接続が正しく終了する代わりにリセットされるさまざまな状況があります。プロセスは終了せずに終了します(Windows)。ソケット読み込みバッファに未読データが残っている間に、プロセスはソケットを閉じます。ホストは、その終わりですでに閉じている接続のためのデータを受信します。これらのすべてがTCP RSTを発行します。 – EJP

関連する問題