断开连接时重新连接Java套接字连接

时间:2009-06-05 02:46:46

标签: java sockets

我有Java代码,它与家庭自动化设备建立长期套接字连接,以监控活动/事件。问题是如果重启设备或重启电源,Java代码应该尽快自动重新连接。有关如何检测Java端连接断开的任何想法,最好不要定期轮询设备吗?

3 个答案:

答案 0 :(得分:3)

如果设备在未正确关闭套接字的情况下重新启动,我不知道任何可以让您检测到它的内容。在这种情况下,您的服务器将无法检测到套接字已消失,除非设备重新启动或服务器上的TCP / IP堆栈放弃并声明连接已关闭。在某些时候你会得到一个IOException.你需要捕获该异常,然后在它发生时重新连接。

你真的受到TCP / IP行为的支配。当连接的一端消失(没有FIN数据包)时,另一端可能会等待任意长度的时间(取决于许多因素),然后才能确定连接已经死亡。

如果您想更早地发现此问题 - 并且您可以保证设备将在设定的时间内响应,则在套接字上设置超时。如果这样做,如果设备没有响应,您将获得SocketTimeoutException,然后您可以关闭套接字并尝试重新打开套接字。我成功地使用了它。

答案 1 :(得分:2)

如果您的软件只是等待来自家庭自动化设备的数据,检测设备不用的唯一方法是启用套接字中的SO_KEEPALIVE选项以与设备通信。

为此,只需在套接字上调用setKeepAlive(true)方法,这将使底层套接字实现启用SO_KEEP_ALIVE选项。

这将使底层实现定期与远程端点交换一些数据,如果设备在您等待数据时死亡,则会抛出异常。

唯一的问题是,保持活动超时取决于操作系统,有时无法更改。

如果您需要更短的超时时间,除了在设备上实施定期探测外,别无他法。

答案 2 :(得分:1)

我已经解决了同样的问题。

如果您想更早地发现此问题 - 并且您可以保证设备将在设定的时间内响应,则在套接字上设置超时。如果这样做,如果设备没有响应,你将得到一个SocketTimeoutException,然后你可以关闭套接字并尝试重新打开套接字。我成功地使用了它。

引自上文:

  

我得到它关闭套接字然后尝试重新打开它,它运行   那个代码很好。唯一的问题是,一旦我关闭了一个插座我   无法重新打开它,我得到了套接字关闭的异常。这个   每次都会发生。如何关闭套接字然后重新打开它   得到这个例外?