0

Androidフォンからタブレットにデータを送信するクライアントサーバーアプリがあります-電話、SMS、バッテリー状態などさらに、クライアントには PhoneStateListener と、通話やバッテリーの状態などを追跡する BroadcastReceiver があります。

要点は、両端が生きているということですが、ある段階で (私のロギング設定によると約 20 分)、クライアントは「壊れたパイプ」があると報告します。

サーバー側では、スレッド内でクライアントからのシングルバイトコマンドをリッスンするループ内のサーバーをブロックしていますが、問題の原因を見つけるために毎分実行されるスレッドも追加しました。

クライアントが破損したパイプを検出すると、サーバーソケットが原因であるという状態があると想定していますが、次のことをテストしています-

  • Socket が開いているかどうか。
  • 入力ストリームまたは出力ストリームが開いているかどうかに関係なく、
  • それらのいずれかが null かどうか。

残念ながら、これらの条件はすべて問題なく、
接続がまだアクティブであるように見えます。何を探すべきですか?

私ができるようにしたいのは、クライアントが「壊れたパイプ」を検出すると、サーバーも検出し、再接続を試みることです。

4

1 に答える 1

0

「壊れたパイプ」とは、相手側で既に閉じられている接続に書き込みを行ったことを意味します。書き込み時に表示されることもあれば、読み取り時に表示されることもあります。いずれの場合も、以前の書き込みを参照します。

あなたの場合、クライアントはこのエラーを受け取ります。サーバーがソケットを閉じているためです。あなたの観察にもかかわらず。入力ストリームまたは出力ストリームを閉じるとソケットが閉じられることに気付いていない可能性があります。

最後の段落では、サーバーは既にソケットを閉じているため、クライアントがエラーを受け取ったことを検出できませんが、修正アクションを実行するソケットがないため、問題ではありません。クライアントがしなければならないのは、再接続することだけです。サーバーが再接続できない可能性があります。

于 2014-05-30T00:45:35.667 に答える