【问题标题】:What condition causes the Broken Pipe Error on the Other End?什么情况会导致另一端的断管错误?
【发布时间】:2014-05-30 00:33:28
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: android sockets broken-pipe


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。服务器不是故意关闭套接字,我在某处读到,由于睡眠一段时间,套接字连接可能会在一段时间后丢失 - 也许这是一个阻塞服务器的事实?它目前是一个 while 循环,我可能会更改为非阻塞设置,并改为使用 Timer & TimerTask 设置。我不明白的是,我在服务器服务中运行的“主管线程”无法检测到套接字条件的任何变化,但它检测到它何时关闭,何时服务被故意关闭.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多