2012-09-08 27 views
1

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

+0

真正的问题是*为什么你认为你需要通知*?如果你知道服务器关闭,你会采取什么行动? – Raffaele

+0

因为我有一个应用程序安装到很多设备,我必须保持它们始终连接。当服务器因为某种原因而关闭或关闭时,我不想重新启动我的应用程序。我希望我的应用程序在服务器应用程序重新启动时连接到我的服务器 – ctugyildiz

回答

2

一个TCP连接不是连续流就像一条河。这是在不连续时间发送的一系列细分 - 因此更像是一辆公路上的汽车。因此,如果道路坏了,直到汽车试图到达另一端,失败并打回电话,则无法通知。

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

+0

这是我的解决方案。谢谢你让我确信我没有其他解决方案。 – ctugyildiz

1

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

+0

感谢您的重播。 – ctugyildiz

2

有3种方法用于TCP明白,连接已经关闭:

  1. 一面得到了一个错误 - 它发送一个复位请求对方​​关闭
  2. 一面真正想要的连接关闭连接,以便向对方发送FIN消息
  3. 尝试从一侧向另一侧传输某些内容时超时。此超时只能在发送tcp-package时发生。连接完成后,tcp的包仅在数据传输请求(和连接关闭请求...)上发送。

所以如果一方突然断开,不在数据传输中间,没有办法发现断开连接,而是发送一些封装一次。

+0

谢谢Turchinsky – ctugyildiz

1

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

+0

谢谢Mahboob – ctugyildiz

相关问题