2

我正在开发一个访问互联网的 Java 桌面应用程序。它是一个多线程应用程序,每个线程做同样的工作(意味着每个线程都是同一个 Thread 类的一个实例)。

现在,由于所有线程都需要互联网连接才能处于活动状态,因此应该有一些机制来检测互联网连接是否处于活动状态。

Q1。如何检测互联网连接是否处于活动状态?

Q2。在哪里实现这个互联网状态检查机制代码?我是否应该启动一个单独的线程来定期检查互联网状态并在状态从一种状态更改为另一种状态时通知所有线程?或者我应该让每个线程检查互联网状态本身吗?

Q3。这个问题应该是一个非常普遍的问题,因为每个访问互联网的应用程序都应该处理这个问题。那么其他开发人员通常如何处理这个问题呢?

Q4。如果你能给我一个解决这个问题的好演示应用程序的参考,那么它将对我有很大帮助。

4

4 回答 4

1

A1:我知道检查连接的唯一平台独立方法是尝试连接到可靠的主机(例如 google.com)

A2:这取决于线程想要获取连接信息的频率。如果有很多线程并且他们需要每秒检查连接,我更喜欢单独的线程。

A3:有特定于平台的方法来解决问题。既然你使用 Java,我认为你不应该依赖它们。

于 2010-04-16T11:31:10.833 回答
1

检查与许多可靠主机的连接,如果它们都无法访问,那么您的 Internet 连接断开的可能性比主机断开的可能性更大。

于 2010-04-16T12:18:20.513 回答
0

如果你不能直接询问操作系统,你可以创建一个到已知主机的套接字连接。如果计算机本身的 Internet 连接中断,则套接字连接将被断开,并且您的程序将收到通知。

如果您需要在“途中”检测连接丢失,您必须定期在套接字上接收数据并跟踪这些数据是否“准时”到达。如果没有,则连接无响应。

于 2010-04-16T12:00:02.440 回答
0

正如其他人提到的,您可以轮询可靠的主机,另一种选择是使用 java.net.NetworkInterface 类及其方法 isUp()。快速演示:

Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces();
while(ifcs.hasMoreElements()){
    NetworkInterface ifc = ifcs.nextElement();
    System.out.println(ifc.getDisplayName()+ " "+ifc.isUp());
}

如果接口断开连接,则 isUp 应返回 false。请注意,这将为您提供所有接口,因此您还应该检查 isLoopback() 以便您可以忽略应该始终启动的环回接口。这种方法应该比轮询主机更可靠,特别是如果您的连接速度很慢,并且是一种更“礼貌”的方法。至少您可以将其用作初始测试,如果接口确实报告自己已启动,那么您可以尝试连接到主机。

于 2010-04-16T14:45:29.370 回答