我有Java代码,它与家庭自动化设备建立长期套接字连接,以监控活动/事件。问题是如果重启设备或重启电源,Java代码应该尽快自动重新连接。有关如何检测Java端连接断开的任何想法,最好不要定期轮询设备吗?
答案 0 :(得分:3)
如果设备在未正确关闭套接字的情况下重新启动,我不知道任何可以让您检测到它的内容。在这种情况下,您的服务器将无法检测到套接字已消失,除非设备重新启动或服务器上的TCP / IP堆栈放弃并声明连接已关闭。在某些时候你会得到一个IOException.
你需要捕获该异常,然后在它发生时重新连接。
你真的受到TCP / IP行为的支配。当连接的一端消失(没有FIN
数据包)时,另一端可能会等待任意长度的时间(取决于许多因素),然后才能确定连接已经死亡。
如果您想更早地发现此问题 - 并且您可以保证设备将在设定的时间内响应,则在套接字上设置超时。如果这样做,如果设备没有响应,您将获得SocketTimeoutException
,然后您可以关闭套接字并尝试重新打开套接字。我成功地使用了它。
答案 1 :(得分:2)
如果您的软件只是等待来自家庭自动化设备的数据,检测设备不用的唯一方法是启用套接字中的SO_KEEPALIVE选项以与设备通信。
为此,只需在套接字上调用setKeepAlive(true)方法,这将使底层套接字实现启用SO_KEEP_ALIVE选项。
这将使底层实现定期与远程端点交换一些数据,如果设备在您等待数据时死亡,则会抛出异常。
唯一的问题是,保持活动超时取决于操作系统,有时无法更改。
如果您需要更短的超时时间,除了在设备上实施定期探测外,别无他法。
答案 2 :(得分:1)
我已经解决了同样的问题。
如果您想更早地发现此问题 - 并且您可以保证设备将在设定的时间内响应,则在套接字上设置超时。如果这样做,如果设备没有响应,你将得到一个SocketTimeoutException,然后你可以关闭套接字并尝试重新打开套接字。我成功地使用了它。
引自上文:
我得到它关闭套接字然后尝试重新打开它,它运行 那个代码很好。唯一的问题是,一旦我关闭了一个插座我 无法重新打开它,我得到了套接字关闭的异常。这个 每次都会发生。如何关闭套接字然后重新打开它 得到这个例外?