当我可以ping IP地址时,为什么InetAddress.isReachable返回false?

当我可以ping IP地址时,为什么InetAddress.isReachable返回false?,第1张

当我可以ping IP地址时,为什么InetAddress.isReachable返回false?

在很多情况下,

"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充分抽象。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5508967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存