可能重复:
如何检查java中是否存在Internet连接?
我想看看是否有人在使用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;
}
Run Code Online (Sandbox Code Playgroud)
最终代码块:
//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;
}
Run Code Online (Sandbox Code Playgroud)
jsi*_*ght 17
这是解决问题的完美合理方法.糟糕的是,您实际上是在测试DNS而不是测试整个网络,但在实践中,您通常可以将这些视为等效.
另外要记住的是,您需要设置一个系统属性来关闭java运行时中的dns缓存.否则,它可能会继续根据缓存的数据报告网络已启动(即使它已关闭).
另一种方法是实际上经常向某些网络地址打开HTTP请求.
Jos*_*arl 11
我必须补充一点,尽管上面给出的最终代码块是好的,它有一个缺陷 - 它可能需要很长时间才能联系指定的地址,但地址仍然可以访问.
在我的实例中,当使用一个地址进行测试时,该方法将返回true,但需要10秒或更长时间才能获得响应.在这种情况下,服务器是可以访问的,但不是出于任何有用的目的,因为连接速度很慢.这是因为默认的超时HttpURLConnection为0,或无限.
出于这个原因,我建议你检查UI线程,并urlConnect.setConnectTimeout(1000); 在调用之前添加urlConnect.getContent();
这样您就知道地址是可以访问的,并且下载10k文件不需要5年.
(您当然可能希望更改超时时间以满足您的需求)
此外,我建议不要检查通用地址(google.com等),除非您的程序通常访问多个域.如果您只是访问一个或两个,那么检查该域.