kre*_*jer 26 java connection tcp
当我使用例如PuTTY并且我的连接丢失时(或者当我ipconfig /release在Windows上执行手册时),它会直接响应并通知我的连接丢失.
我想创建一个Java程序来监视我的Internet连接(到一些可靠的服务器),以记录我的Internet失败时的日期/时间.
我尝试使用该Socket.isConnected()方法,但这将永远返回"真".我怎么能用Java做到这一点?
jjn*_*guy 20
好吧,判断连接是否中断的最佳方法是尝试从套接字读取/写入.如果操作失败,那么您有时会丢失连接.
因此,您需要做的就是尝试在某个时间间隔读取,如果读取失败,请尝试重新连接.
对您而言,重要的事件是当读取失败时 - 您丢失连接,并且当连接新套接字时 - 您重新获得连接.
这样您就可以跟踪正常运行时间和停机时间.
tpu*_*nen 13
即使TCP/IP是"面向连接"协议,通常也不会通过空闲连接发送数据.您可以将套接字打开一年,而IP堆栈不会通过它发送一个套接字.为了注意连接丢失,您必须在应用程序级别发送一些数据.(*)您可以通过从ADSL调制解调器上拔下电话线来试试.除非应用程序具有某种应用程序级别的keepalive机制,否则PC中的所有连接都应保持运行.
因此,注意丢失连接的唯一方法是打开到某个服务器的TCP连接并从中读取一些数据.也许最简单的方法是连接到某个FTP服务器并偶尔获取一个小文件 - 或目录列表.我从来没有见过一个真正意味着用于这种情况的通用服务器,并且FTP服务器的所有者可能不喜欢客户端这样做.
(*)还有一种称为TCP keepalive的机制,但是在许多操作系统中你必须为所有应用程序激活它,如果你想快速注意到连接丢失,那么使用它并不实际
如果客户端已正确断开连接,则对于任何其他X抛出,a read()将返回-1,readLine()返回null .检测丢失的TCP连接的唯一可靠方法是写入它.因此最终将抛出"连接重置",但由于缓冲,它至少需要两次写入.readXXX()EOFExceptionIOException
为什么不使用该类的isReachable()方法java.net.InetAddress?
这是如何工作的特定于JVM实现,但是:
如果可以获得特权,则典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接.
如果你想连续打开一个连接,那么你可以看到什么时候失败,你可以自己连接到运行ECHO协议的服务器,而不是isReachable()为你做,读取和写入数据并等待它失败.