0

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

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

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

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

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

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

我想要做的是一旦客户端检测到“断管”,服务器也会这样做,并尝试重新连接。

4

1 回答 1

0

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

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

关于你的最后一段,服务器已经关闭了套接字,所以它无法检测到客户端收到错误,但这没关系,因为它没有套接字可以采取纠正措施。客户端所要做的就是重新连接。服务器不可能重新连接。

于 2014-05-30T00:45:35.667 回答