一尘不染

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

java

InetAddress byName = InetAddress.getByName("173.39.161.140");
   System.out.println(byName);
   System.out.println(byName.isReachable(1000));

为什么要isReachable退货false?我可以ping通IP。


阅读 1271

收藏
2020-03-03

共1个答案

一尘不染

在很多情况下,"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充分抽象。

2020-03-03