什么条件导致另一端的管道错误?

时间:2014-05-30 00:33:28

标签: android sockets broken-pipe

我有一个客户端 - 服务器应用程序,从Android手机发送数据到平板电脑 - 电话,短信,电池状况等。电话是客户端,平板电脑服务器,都运行服务,带有部分唤醒锁让它们保持足够长的时间,加上客户端有一个PhoneStateListener,还有一个BroadcastReceiver来跟踪呼叫,电池状况等。

关键是两端都保持活着,但在某个阶段 - 根据我的记录设置大约20分钟 - 客户报告我有一个“破管”。

在服务器端,我有一个阻塞服务器,在一个循环中,在一个线程中侦听来自客户端的单字节命令,但我还添加了一个每分钟运行一次的线程,找出导致问题的原因。

当客户端检测到管道损坏时,我假设存在服务器套接字所在的情况,导致它,但我正在测试以下内容 -

  • Socket是否打开。
  • 输入或输出流是否已打开,
  • 其中任何一个是否为空。

不幸的是,所有这些条件都很好,就像是 连接仍然有效。我应该寻找什么?

我希望能够做到的是,一旦客户端检测到“Broken Pipe”,服务器也会检测到,并尝试重新连接。

1 个答案:

答案 0 :(得分:0)

'断管'表示您已写入已被另一端关闭的连接。有时它出现在写入中,有时出现在读取中。在所有情况下,它都指的是之前的写。

在您的情况下,客户端收到此错误, ergo 服务器已关闭套接字。尽管你的意见。可能您不知道关闭输入或输出流会关闭套接字。

重新上一段,服务器已经关闭了套接字,因此无法检测到客户端是否收到错误,但无关紧要,因为无论如何都没有套接字来采取纠正措施。客户端所要做的就是重新连接。 服务器无法重新连接。