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