web-dev-qa-db-ja.com

正確には、「壊れたパイプ」の例外はソケットにとって何を意味しますか?

Androidアプリがあります。Android(Java)Socketクラスを使用しています。停止して再起動すると、次回Androidから何かを送信するときのPCアプリIO Exception "Broken Pipe"。私の質問はそれについてではありません。ここに質問があります:

ソケットのisClosed()メソッドをクエリすると壊れたパイプ例外が発生した後、falseを返します(つまり、閉じていません)。また、ソケットのisConnected()メソッドをクエリするとそれは真を返します、つまり、IS接続されています。誰かがこれらの結果を私に説明してくれませんか?よろしくお願いします!

30
user316117

壊れたパイプは、ここで話していることとほぼ同じ意味です。あなたの側のプログラムはまだソケットを大きく開いていますが、反対側のソケットは通信しておらず、標準の「パイプを閉じる」手順を実行していません。これは、反対側が突然電源を失った場合、物理的な回線が切断された場合などに発生します。そのため、ローカルでソケットはオープンと接続の両方として登録されています-壊れたパイプに接続されているだけです。ここで実用的なアドバイスを望みましたか、それとも理論だけですか?

21
Ben Barden

Socket.isClosed()およびSocket.isConnected()は、あなたsocket。接続の状態について何かを伝えるためのものではありません。ソケットを閉じました:開いています。ソケットを接続しました。接続されています。

IOException以外のSocketを操作してSocketTimeoutExceptionを取得した場合は、ソケットを閉じる必要があります。

2
user207421