我正在开发一个需要随时连接互联网的Java项目。
我希望我的程序能够在某个时间间隔(例如5或10秒)检查互联网连接,并在没有检测到互联网连接时立即显示消息。
我曾尝试使用isReachable方法来实现此功能,下面是代码 -
try
{
InetAddress add = InetAddress.getByName("www.google.com");
if(add.isReachable(3000)) System.out.println("Yes");
else System.out.println("No");
}
catch (UnknownHostException e)
{
System.out.println("unkownhostexception");
}
catch (IOException e)
{
System.out.println("IoException");
}
但是这段代码总是返回“否”。这段代码有什么问题?
谢谢
答案 0 :(得分:17)
如果您只是经常使用互联网,我同意Raffaele的建议。只是尝试这样做,并准备好在失败时处理异常。
如果您出于某种原因需要监控互联网的可用性,即使您不打算使用它并且不知道您将连接到谁,只需尝试连接到已知良好的站点(google.com,amazon.com,baidu.com ......)。
这将测试一些网站:
public static void main(String[] args) {
System.out.println(
"Online: " +
(testInet("myownsite.example.com") || testInet("google.com") || testInet("amazon.com"))
);
}
public static boolean testInet(String site) {
Socket sock = new Socket();
InetSocketAddress addr = new InetSocketAddress(site,80);
try {
sock.connect(addr,3000);
return true;
} catch (IOException e) {
return false;
} finally {
try {sock.close();}
catch (IOException e) {}
}
}
答案 1 :(得分:9)
我所知道的唯一方法是将数据包发送到某个已知主机,这个主机已经知道知道它将始终启动并运行并可从主叫站点访问。
但是,例如,如果选择命名主机,则ping可能会因DNS查找失败而失败。
我认为您不应该担心这个问题:如果您的程序需要Internet连接,那是因为它发送或接收数据。连接不像河流那样是连续概念,而更像是一条道路。因此,只需使用Java标准来处理连接错误:IOExceptiions。当您的程序必须发送数据时,如果网络出现故障,底层API将无法引发IOE。如果您的程序需要数据,请使用超时或类似的方法来检测网络堆栈中的可能错误并将其报告给用户。