如何使用java套接字编程知道网络何时关闭
Posted
技术标签:
【中文标题】如何使用java套接字编程知道网络何时关闭【英文标题】:How to know when network down using java socket programming 【发布时间】:2009-08-13 14:31:24 【问题描述】:您好,我对如何检测网络何时离线有疑问。 我的服务器和客户端在不同的计算机上。但通过局域网连接 实际上我已经用java编写了tcp socket编程。 一旦服务器和客户端都连接了,那么如果我写一些东西并休眠 10 秒,那么我会移除我的 LAN 电缆。
1 分钟后,我插入了 LAN 电缆。但我知道服务器和客户端之间可以像往常一样发生事务。
谢谢 苏尼尔·库马尔·萨胡
【问题讨论】:
【参考方案1】:如果我正确理解您的问题,您需要能够快速确定网络是慢还是完全停机。
这不是一件容易的事。
这里有两种不同的情况。您的源计算机或路径上的某些路由器都知道通往目的地的路线存在永久性问题。或者没有这种意识。
例如,如果您将 LAN 电缆从源计算机(发送请求并等待响应的计算机)中拔出,网络驱动程序会意识到与世界的连接已断开。它会立即通知您错误。这是第一种情况。
另一方面,如果您从目标计算机拔下插头,则目标网关不知道 那台 计算机出现故障。您的请求将在目标子网上发送出去,但它们当然会被忽略。这是第二种情况。
在远程故障(第二种问题)的情况下,您的 TCP 堆栈最终会确定目标机器没有通话。但是,这需要几分钟。我相信这是一个系统配置参数。
我知道的唯一解决方案是使用异步在线应用程序级协议和某种心跳消息,以及合理的超时(秒)。
【讨论】:
【参考方案2】:TCP 将在 2 分钟的连接丢失后继续存在。任何丢失的数据包都将被重新传输。这是设计使然:互联网应该能够在核战争中幸存下来,而在“网络”被发明时,网络硬件也不是那么可靠。
如果您需要更快地知道,您必须向服务器发送一个小测试消息并自己处理超时(几秒钟内没有响应),可能在不同的线程中。
【讨论】:
【参考方案3】:如果一切正常,我建议你不要担心电脑离线。
否则,在应用程序级别实现的“ping”是有序的,即客户端发送一个简单的 ping 消息并期望来自服务器的响应。
【讨论】:
【参考方案4】:我过去所做的是编写一个使用重复 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 布尔值的状态在代码的其他部分执行操作。
【讨论】:
感谢 Dopyiii,你实现的这个逻辑真的帮了我很多 希望它能让你开始!在这里的宏伟设计中,我有一个带有“连接”集合的单例。这样,静态单例将在程序的生命周期内保持活动状态。每个“连接”对象都有一个像这样更新其状态的线程计时器。在过去,我还创建了一个监视器单例,它遍历对象集合并询问它们的状态。使用它,我可以确定所有套接字连接的总状态。有意义吗? isConnected 和 isClosed 不会改变,除非您调用适当的方法。它们不会异步更改。 isReachable 将检查主机是否可访问,但服务本身可能已关闭。 正是如此。这段代码在检测死连接方面毫无用处,isReachable()
测试浪费了网络资源来建立和拆除第二个 TCP 连接。投反对票。以上是关于如何使用java套接字编程知道网络何时关闭的主要内容,如果未能解决你的问题,请参考以下文章