2010-04-16 42 views
2

我正在开发一个访问互联网的Java桌面应用程序。它是一个多线程应用程序,每个线程都执行相同的工作(意味着每个线程都是同一个Thread类的一个实例)。Java - 如何检测互联网连接通过Java桌面应用程序断开连接?

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

Q1。如何检测互联网连接是否激活? Q230。

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

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

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

回答

1

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

A2:这取决于线程要如何频繁地获取信息关于连接。如果有很多线程,并且他们需要每秒检查一次连接,我宁愿单独的线程。

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

+0

是的,我只需要独立于平台的方式来检查互联网状态 – 2010-04-16 11:43:41

0

如果您不能直接询问操作系统,则可以创建与已知主机的套接字连接。如果互联网连接在电脑本身出现故障,套接字连接将被拆除并且您的程序将被通知。

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

+0

即使在“询问OS”方法中,我们也有一个问题:我们应该如何区分与互联网和内部网的连接? – Dmitry 2010-04-16 12:50:52

1

检查它们是否所有可达连接到号可靠的主机,那么你有更多的机会你的互联网连接比主机是down下来。

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(),以便您可以忽略始终处于启用状态的回送接口。这种方法应该比轮询主机更可靠,特别是如果你的连接速度慢,以及作为一个更“礼貌”的方法。至少您可以将其用作初始测试,并且如果界面确实报告自己处于启动状态,那么您可以尝试连接到主机。

+1

请注意,“接口已启动”不等于“到Internet的连接处于活动状态”。所以,它只能用作预检。 – Dmitry 2010-04-16 15:20:35