Java检测丢失的连接

kre*_*jer 26 java connection tcp

当我使用例如PuTTY并且我的连接丢失时(或者当我ipconfig /release在Windows上执行手册时),它会直接响应并通知我的连接丢失.

我想创建一个Java程序来监视我的Internet连接(到一些可靠的服务器),以记录我的Internet失败时的日期/时间.

我尝试使用该Socket.isConnected()方法,但这将永远返回"真".我怎么能用Java做到这一点?

jjn*_*guy 20

好吧,判断连接是否中断的最佳方法是尝试从套接字读取/写入.如果操作失败,那么您有时会丢失连接.

因此,您需要做的就是尝试在某个时间间隔读取,如果读取失败,请尝试重新连接.

对您而言,重要的事件是当读取失败时 - 您丢失连接,并且当连接新套接字时 - 您重新获得连接.

这样您就可以跟踪正常运行时间和停机时间.

  • 不,不会.您无法区分具有读取超时的慢速服务器和丢失的连接. (12认同)
  • @EJP这并不总是正确的,但它会让你对正在发生的事情有一个很好的了解. (3认同)
  • 不正确.如果您设置了读取超时并且它触发了您获得异常,即操作失败,但它不一定表示连接丢失. (2认同)

tpu*_*nen 13

即使TCP/IP是"面向连接"协议,通常也不会通过空闲连接发送数据.您可以将套接字打开一年,而IP堆栈不会通过它发送一个套接字.为了注意连接丢失,您必须在应用程序级别发送一些数据.(*)您可以通过从ADSL调制解调器上拔下电话线来试试.除非应用程序具有某种应用程序级别的keepalive机制,否则PC中的所有连接都应保持运行.

因此,注意丢失连接的唯一方法是打开到某个服务器的TCP连接并从中读取一些数据.也许最简单的方法是连接到某个FTP服务器并偶尔获取一个小文件 - 或目录列表.我从来没有见过一个真正意味着用于这种情况的通用服务器,并且FTP服务器的所有者可能不喜欢客户端这样做.

(*)还有一种称为TCP keepalive的机制,但是在许多操作系统中你必须为所有应用程序激活它,如果你想快速注意到连接丢失,那么使用它并不实际


use*_*421 8

如果客户端已正确断开连接,则对于任何其他X抛出,a read()将返回-1,readLine()返回null .检测丢失的TCP连接的唯一可靠方法是写入它.因此最终将抛出"连接重置",但由于缓冲,它至少需要两次写入.readXXX()EOFExceptionIOException


Dav*_*ebb 7

为什么不使用该类的isReachable()方法java.net.InetAddress

这是如何工作的特定于JVM实现,但是:

如果可以获得特权,则典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接.

如果你想连续打开一个连接,那么你可以看到什么时候失败,你可以自己连接到运行ECHO协议的服务器,而不是isReachable()为你做,读取和写入数据并等待它失败.

  • 现有连接是否仍然打开与 `isReachable()` 没有任何关系。 (2认同)