【问题标题】:how to understand java remote socket is unreachable when remote socket's device is shutdowned or application force closed当远程套接字的设备关闭或应用程序强制关闭时如何理解java远程套接字无法访问
【发布时间】:2012-09-08 18:28:52
【问题描述】:

我有一个 as3 serversocket,我们通过 java socket(一个 android 应用程序)连接到这个 serversocket。问题是,当服务器套接字应用程序强制关闭时,我无法找到一种方法来理解远程套接字已关闭或无法访问,除非尝试刷新()到该套接字的消息会引发损坏的管道错误。我想以另一种方式解决这个问题的原因是不是让服务器应用程序忙于连接检查消息?

【问题讨论】:

  • 真正的问题是你为什么认为你需要通知?如果您知道服务器已关闭,您会采取什么措施?
  • 因为我有一个安装到很多设备上的应用程序,我必须让它们始终保持连接。当服务器因某种原因关闭或关闭时,我不想重新启动我的应用程序。我希望我的应用在服务器应用重新启动时连接到我的服务器。

标签: java sockets serversocket


【解决方案1】:

TCP 连接不像河流那样连续流动。它是在离散时间发送的一系列段 - 因此更像是路上的汽车。因此,如果道路坏了,没有办法得到通知,直到一辆车试图到达另一端,失败,然后给你回电话。

您应该简单地以合理的时间间隔(30 秒?)继续发送 cars,从而指示您的服务器在收到 NOOP 消息(No Operation 的缩写)时什么都不做。客户端将被编程为在连接空闲时开始发送 NOOP(30 秒内没有发送或接收消息),并且当 驱动程序 回叫他无法到达目的地时,您关闭当前套接字并尝试创建另一个。

【讨论】:

  • 这是我的解决方案。谢谢你让我确定我没有其他解决方案。
【解决方案2】:

TCP 有 3 种方式了解连接已关闭:

  1. 一方出错 - 它向另一方发送重置请求以关闭连接
  2. 一方实际上想要关闭连接,所以它向另一方发送一条 FIN 消息
  3. 尝试将某些内容从一侧传输到另一侧时超时。这种超时只会在发送 tcp 包时发生。建立连接后,tcp 的包仅在数据传输请求(和连接关闭请求...)时发送。

所以如果一侧突然断线,不是在数据传输过程中,没有办法发现断线,只能偶尔发送一些包。

【讨论】:

    【解决方案3】:

    你找到了唯一的方法。除了尝试使用它之外,TCP 不提供任何检查连接状态的方法。您可以更智能地使用它,例如您可以向自己发送心跳消息等。但是没有 API 可以告诉你。

    【讨论】:

      【解决方案4】:

      你可以做的是让服务器每 5/10 分钟广播一次我还活着消息:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 2016-08-20
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        相关资源
        最近更新 更多