相手ピアが××をした ↓ | こちらは##していた | ||||
---|---|---|---|---|---|
入力ストリームをreadしていた | 出力ストリームにwriteしていた | selectしていた | I/O以外の計算処理をしていた | sleepまたはwaitしていた | |
こちらピアに起きること | こちらピアに起きること | こちらピアに起きること | こちらピアに起きること | こちらピアに起きること | |
Socketをcloseした | read()は-1を返す. readLine()はnullを返す. そのほかのreadXXX()はEOFExceptionを投げる. | SocketException: connection resetを投げる(すぐではないことが多い) | OP_READでセレクトし, その後のreadは左記'readしていた'の場合と同じ結果に. | 次のread/writeで左記の状態になる.次のread/writeで左記の状態になる. | |
出力ストリームをcloseした | --相手ピアのSocketがcloseされるので,こちら側に起きることは上(Socketのclose)と同じ-- | ||||
入力ストリームをcloseした | --相手ピアのSocketがcloseされるので,こちら側に起きることは上(Socketのclose)と同じ-- | ||||
出力をshutdownした | --read中のこちら側に起きることは, 相手ピアが出力ストリームをcloseした場合(上記)と同じ(writeは無影響)-- | ||||
入力をshutdownした | readは正常に続行される | writeは成功するが相手側は受信したデータを無視(UNIX), SocketException: connection reset by peerを投げる(Windows), 相手は受信データをバッファに入れるだけでアプリケーションに送らないのでwriteはやがてブロックする(Linux)※ | 次のread/writeで左記の状態となる | 次のread/writeで左記の状態となる | 次のread/writeで左記の状態となる |
ソケットもI/Oストリームもcloseせずにプログラムが突然終了した | 結果はcloseと同じであるべきだが、現実はプラットホーム依存: 何もしないと、readがタイムアウトするかまたはいつまでもブロックする; RSTを発行するとその後のwriteはSocketException: connection resetを投げる. |