【发布时间】:2009-08-13 14:31:24
【问题描述】:
您好,我对如何检测网络何时离线有疑问。 我的服务器和客户端在不同的计算机上。但通过局域网连接 实际上我已经用java编写了tcp socket编程。 一旦服务器和客户端都连接了,那么如果我写一些东西并休眠 10 秒,那么我会移除我的 LAN 电缆。
1 分钟后,我插入了 LAN 电缆。但我知道服务器和客户端之间可以像往常一样发生事务。
谢谢 苏尼尔·库马尔·萨胡
【问题讨论】:
您好,我对如何检测网络何时离线有疑问。 我的服务器和客户端在不同的计算机上。但通过局域网连接 实际上我已经用java编写了tcp socket编程。 一旦服务器和客户端都连接了,那么如果我写一些东西并休眠 10 秒,那么我会移除我的 LAN 电缆。
1 分钟后,我插入了 LAN 电缆。但我知道服务器和客户端之间可以像往常一样发生事务。
谢谢 苏尼尔·库马尔·萨胡
【问题讨论】:
如果我正确理解您的问题,您需要能够快速确定网络是慢还是完全停机。
这不是一件容易的事。
这里有两种不同的情况。您的源计算机或路径上的某些路由器都知道通往目的地的路线存在永久性问题。或者没有这种意识。
例如,如果您将 LAN 电缆从源计算机(发送请求并等待响应的计算机)中拔出,网络驱动程序会意识到与世界的连接已断开。它会立即通知您错误。这是第一种情况。
另一方面,如果您从目标计算机拔下插头,则目标网关不知道 那台 计算机出现故障。您的请求将在目标子网上发送出去,但它们当然会被忽略。这是第二种情况。
在远程故障(第二种问题)的情况下,您的 TCP 堆栈最终会确定目标机器没有通话。但是,这需要几分钟。我相信这是一个系统配置参数。
我知道的唯一解决方案是使用异步在线应用程序级协议和某种心跳消息,以及合理的超时(秒)。
【讨论】:
TCP 将在 2 分钟的连接丢失后继续存在。任何丢失的数据包都将被重新传输。这是设计使然:互联网应该能够在核战争中幸存下来,而在“网络”被发明时,网络硬件也不是那么可靠。
如果您需要更快地知道,您必须向服务器发送一个小测试消息并自己处理超时(几秒钟内没有响应),可能在不同的线程中。
【讨论】:
如果一切正常,我建议你不要担心电脑离线。
否则,在应用程序级别实现的“ping”是有序的,即客户端发送一个简单的 ping 消息并期望来自服务器的响应。
【讨论】:
我过去所做的是编写一个使用重复 java Timer 的小型连接监视器类。当计时器关闭时,我通过向连接询问三种信息来检查连接的状态:ifConnected(验证它是否在过去连接过)、!isClosed()(因此,连接应该仍然处于活动状态) 和 isReachable() (可以到达目的地吗?)。像这样的东西(用作示例,而不是解决方案):
public static boolean isConnected = false;
// pretend other stuff is properly declared in the surrounding class
private class CxMonitor {
CxMonitor() {
javax.swing.Timer timer = new Timer(5000, new ActionListener() {
// what happens when the timer goes off
public void actionPerformed(ActionEvent e) {
isConnected = mySocket.isConnected() &&
!mySocket.isClosed() &&
InetAddress.getByName(severAddress).isReachable(1000);
}
}
timer.setRepeats(true);
timer.start();
}
}
这使我能够监控套接字连接状态。然后,我根据 isConnected 布尔值的状态在代码的其他部分执行操作。
【讨论】:
isReachable() 测试浪费了网络资源来建立和拆除第二个 TCP 连接。投反对票。