Java ソケット API: 閉じられた接続の識別
Java ソケット API を使用してリモート接続のステータスを判断するのは困難な場合があります。ソケットのローカル状態のみを反映する isConnected() および isClosed() とは異なり、接続がリモート パーティによって切断されたかどうかを確認するのは簡単ではありません。
接続ステータスを正確に判断するには、次のようにします。ソケットと積極的に対話する必要があります。以下にいくつかのアプローチを示します。
-
データ交換: 出力ストリームにデータを書き込もうとし、それがスローする例外をキャプチャすると、接続が閉じられていることを示す可能性があります。ただし、このアプローチは不必要なトラフィックを常に送信するため、理想的ではありません。
-
入力/出力のブロック: 接続が正常に閉じられると、readLine() や read() などの操作がブロックされます。予測可能な値 (-1 または null) を返します。残念ながら、接続が突然切断された場合、この方法は適時ではない可能性があります。
-
読み取りタイムアウト: 読み取りタイムアウトを構成すると、非アクティブな接続の検出に役立ちます。データを受信する前にタイムアウトが経過すると、接続が失われる可能性があります。
-
無効なSelectionKeys: Java 7以降では、OP_READを指定してselect()を使用すると、関連付けられたSelectionKeyが無効になったときに閉じられた接続を検出できます。無効。ただし、この動作はプラットフォームと JRE バージョンによって異なる場合があります。
これらのメソッドは、リモート ピアが適切な接続終了エチケットに従っている場合にのみ、終了した接続を即座に検出することに注意してください。そうしないと、接続が半閉状態になり、検出が難しくなる可能性があります。
以上がJava Socket API を使用して、閉じられたリモート接続を確実に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。