Java - 如何通过Java桌面应用程序检测到Internet连接已断开连接?

时间:2010-04-16 11:11:15

标签: java multithreading internet-connection

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

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

Q1。如何检测互联网连接是否有效?

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

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

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

4 个答案:

答案 0 :(得分:1)

A1:我所知道的唯一与平台无关的检查连接方式是尝试连接到可靠的主机(例如google.com)

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

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

答案 1 :(得分:1)

检查与可靠主机数量的连接,如果全部无法访问,那么您的互联网连接失败的可能性大于主机关闭的时间。

答案 2 :(得分:0)

如果无法直接询问操作系统,则可以创建与已知主机的套接字连接。如果互联网连接在计算机本身中断开,则套接字连接将被拆除,并且将通知您的程序。

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

答案 3 :(得分: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(),以便可以忽略应该始终启动的回送接口。这种方法应该比轮询主机更可靠,特别是如果您的连接速度很慢,并且是一种更“礼貌”的方法。至少你可以使用它作为初始测试,如果接口确实报告自己正在启动,那么你可以尝试连接到主机。