InetAddress byName = InetAddress.getByName("173.39.161.140"); System.out.println(byName); System.out.println(byName.isReachable(1000));
为什么要isReachable退货false?我可以ping通IP。
isReachable
false?
在很多情况下,"isReachable"方法对我来说并不值得使用。你可以滚动到底部以查看我的替代方法,该方法可以简单地测试你是否在线并且能够解析外部主机(例如google.com)…这似乎通常可以在* NIX机器上使用。
"isReachable"
* 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充分抽象。