在很多情况下,
"isReachable"方法对我来说并不值得使用。你可以滚动到底部以查看我的替代方法,该方法可以简单地测试你是否在线并且能够解析外部主机(例如google.com)…这似乎通常可以在
* NIX机器上使用。
问题
关于此有很多chat不休:
- 这是其他类似的问题:
使用Java检测互联网连接
如何使用Java测试互联网的可用性?
- 甚至在同一件事上有报告的错误:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4921816
第1部分:问题的可重现示例
请注意,在这种情况下,它将失败。
//also, this fails for an invalid address, like "www.sjdosgoogle.com1234sd" InetAddress[] addresses = InetAddress.getAllByName("www.google.com"); for (InetAddress address : addresses) { if (address.isReachable(10000)) { System.out.println("Connected "+ address); } else {System.out.println("Failed "+address); } } //output:*Failed www.google.com/74.125.227.114*
第2部分:老套的解决方法
或者,你可以执行以下 *** 作:
// in case of Linux change the 'n' to 'c' Process p1 = java.lang.Runtime.getRuntime().exec("ping -n 1 www.google.com"); int returnVal = p1.waitFor(); boolean reachable = (returnVal==0);
ping的-c选项将允许ping简单地尝试到达服务器一次(这与我们在终端上使用的无限ping相反)。
如果主机可达,它将返回0。否则,你将获得“ 2”作为返回值。
简单得多-但当然它是特定于平台的。使用此命令可能会有一些特权警告-但我发现它可以在我的机器上使用。
请注意:1)此解决方案不是生产质量。它有点hack。如果google关闭,或者你的互联网暂时变慢,或者即使你的权限/系统设置有些有趣,是否可能返回假阴性(即即使输入地址可访问也可能失败)。2)isReachable失败是一个突出的问题。再说一次-由于JVM尝试访问主机的方式,有许多在线资源表明在撰写本文时尚无“完美”的方法可以做到这一点-我想这是一个固有的平台特定任务,尽管很简单,尚未被JVM充分抽象。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)