32

PC上のプログラムと通信するAndroidアプリがあります。Android(Java)Socketクラスを使用しています。次にAndroidから何かを送信するときにPCアプリを停止して再起動すると、IO例外「パイプの破損」が発生します。私の質問はそれについてではありません。ここに質問があります:

壊れたパイプの例外を取得した後、SocketのisClosed()メソッドを照会すると、falseが返され(つまり、閉じられていません)、SocketのisConnected()メソッドを照会すると、trueが返されます。つまり、接続されています。誰かがこれらの結果を私に説明してもらえますか?前もって感謝します!

4

3 に答える 3

24

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

于 2012-06-05T14:49:02.300 に答える
3

Socket.isClosed()ソケットに対してSocket.isConnected()したかだけを教えてください彼らはあなたに接続の状態について何も言うためにそこにいません。ソケットは閉じていません。開いています。ソケットを接続しました:接続されています。

それ以外のIOException操作を行う場合は、ソケットを閉じる必要があります。SocketSocketTimeoutException

于 2012-06-06T00:33:37.787 に答える
1

AndroidアプリからArduinoに接続されたBluetoothモジュールにデータを送信しようとしたときに同じ問題が発生しました。Bluetoothモジュールを新しいものに変更してすべてが完全に機能し始めるまでに時間がかかりすぎたため、また、特にコードに自信があり、ソリューションが不足している場合は、ハードウェアを確認する価値があります。

于 2020-08-12T21:27:46.527 に答える