我有一个 as3 serversocket,我们通过 java socket(一个 android 应用程序)连接到这个 serversocket。问题是,当服务器套接字应用程序强制关闭时,我无法找到一种方法来理解远程套接字已关闭或无法访问,除非尝试刷新()到该套接字的消息会引发损坏的管道错误。我想以另一种方式解决此问题的原因不是让服务器应用程序忙于连接检查消息吗?
问问题
329 次
4 回答
2
TCP 有 3 种方式可以了解连接已关闭:
- 一方出错 - 它向另一方发送重置请求以关闭连接
- 一方实际上想要关闭连接,所以它向另一方发送一条 FIN 消息
- 尝试将某些内容从一侧传输到另一侧时的超时。这种超时只会在发送 tcp 包时发生。建立连接后,tcp 的包仅在数据传输请求(和连接关闭请求......)时发送。
所以如果一侧突然断线,不是在数据传输过程中,没有办法发现断线,只能偶尔发送一些包。
于 2012-09-08T09:13:14.163 回答
2
TCP 连接不像河流那样连续流动。它是在离散时间发送的一系列段 - 因此更像是路上的汽车。所以如果道路坏了,没有办法得到通知,直到一辆车试图到达另一端,失败,然后给你回电话。
您应该简单地以合理的时间间隔(30 秒?)发送汽车,从而指示您的服务器在收到 NOOP 消息(No Operation 的缩写)时什么都不做。客户端将被编程为在连接空闲时开始发送 NOOP(30 秒内没有发送或接收消息),当驱动程序回调他无法到达目的地时,您关闭当前套接字并尝试创建另一个一。
于 2012-09-08T10:28:52.190 回答
1
你找到了唯一的方法。除了尝试使用它之外,TCP 不提供任何检查连接状态的方法。您可以更智能地使用它,例如您可以向自己发送心跳消息等。但是没有 API 可以告诉你。
于 2012-09-08T08:10:29.523 回答
1
你可以做的是让服务器每 5/10 分钟广播一次我还活着的消息:)
于 2012-09-08T09:23:50.420 回答