可能的重复:
如何检查java中是否存在互联网连接?
我想看看是否有人有一种简单的方法来检测使用 Java 时是否有互联网连接。当前的应用程序在 Windows 中使用了 WinInit DLL 中的“InternetGetConnectedState”方法,但我的应用程序需要跨平台才能进行 mac 操作,这种方式不起作用。我根本不知道 JNI,也不知道如何在 Java 中使用 DLL,而且它很快就变得令人沮丧。
我能想到的唯一方法是尝试打开到网站的 URL 连接,如果失败,则返回 false。我的另一种方式如下,但我不知道这是否总体稳定。如果我拔掉网络电缆,在尝试创建 InetAddress 时会收到 UnknownHostException。否则,如果连接了电缆,我会得到一个有效的 InetAddress 对象。我还没有在 Mac 上测试下面的代码。
感谢您提供的任何示例或建议。
更新:最终代码块位于底部。我决定采纳 HTTP 请求(在本例中为 Google)的建议。它很简单,并向站点发送请求以返回数据。如果我无法从连接中获取任何内容,则说明没有互联网。
public static boolean isInternetReachable()
{
try {
InetAddress address = InetAddress.getByName("java.sun.com");
if(address == null)
{
return false;
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}
最终代码块:
//checks for connection to the internet through dummy request
public static boolean isInternetReachable()
{
try {
//make a URL to a known source
URL url = new URL("http://www.google.com");
//open a connection to that source
HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();
//trying to retrieve data from the source. If there
//is no connection, this line will fail
Object objData = urlConnect.getContent();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}
这是解决问题的完全合理的方法。不好的是,您实际上是在测试 DNS,而不是测试整个网络,但在实践中,您通常可以将它们视为等效的。
另一件要记住的事情是,您需要设置一个系统属性来关闭 java 运行时中的 dns 缓存。否则,它可能会根据缓存的数据继续报告网络已启动(即使网络已关闭)。
另一种方法是经常向某个网络地址(例如此地址)实际打开 HTTP 请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)