嗨我有一个问题,如何检测网络何时脱机。 我的服务器和客户端在不同的计算机上。但是通过LAN连接 其实我在java中编写了tcp socket编程。 一旦连接了服务器和客户端,如果我写了一些东西并进行了10秒的睡眠,那么我就移除了我的LAN电缆。
1分钟后,我插上了LAN电缆。但是我可以照常在服务器和客户端之间进行交易。
由于 Sunil Kumar Sahoo
答案 0 :(得分:3)
如果我正确理解您的问题,您需要能够快速判断网络是慢速还是完全失效。
这不是一件容易的事。
这里有两种不同的情况。您的源计算机或路径上的某个路由器都知道到目的地的路由存在永久性问题。或者没有这种意识。
例如,如果您将LAN电缆从源计算机(发送请求并等待响应的电脑)中拉出,网络驱动程序将意识到与世界的连接已消失。它会立即通知您错误。这是第一种情况。
另一方面,如果从目标计算机拔出插头,目标网关不知道 计算机已关闭。您的请求将在目标子网上发送,但它们当然会被忽略。这是第二种情况。
在远程故障(第二种问题)的情况下,您的TCP堆栈最终将确定目标计算机没有通话。但是,它需要几分钟。我相信这是一个系统配置参数。
我所知道的唯一解决方案是使用异步线上应用程序级协议和某种心跳消息,并具有合理的超时(秒)。
答案 1 :(得分:1)
TCP将在2分钟的连接丢失中存活。任何丢失的数据包都将被重传。这是设计的:互联网应该在核战争中存活下来,当网络被发明时,网络硬件也不那么可靠。
如果您需要更快地了解,您必须向服务器发送一条小测试消息并自行处理超时(几秒内没有响应),可能是在另一个线程中。
答案 2 :(得分:0)
如果一切正常,我建议您不要担心计算机会脱机。
否则,在应用程序级别实现的'ping'是有序的,即客户端发送一个简单的ping消息并期望来自服务器的响应。
答案 3 :(得分:0)
我过去所做的是编写一个使用重复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布尔值的状态在代码的其他部分执行操作。