当远程套接字设备关闭或应用程序强制关闭时,如何理解java远程套接字无法访问

时间:2012-09-08 08:04:37

标签: java sockets serversocket

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

4 个答案:

答案 0 :(得分:2)

有三种方法可以让TCP了解连接是否已关闭:

  1. 一方收到错误 - 它向另一方发送重置请求以关闭连接
  2. 一方实际上想要关闭连接,以便向另一方发送FIN消息
  3. 尝试将某物从一侧传送到另一侧时超时。只有在发送tcp-package时才会发生此超时。建立连接后,tcp的软件包仅在数据传输请求(和连接关闭请求...)上发送。
  4. 因此,如果一方突然断开连接,而不是在数据传输的中间,则无法发现断开连接,而是偶尔发送一些包。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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