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

发布于 2021-02-02 22:59:32

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

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

关注者
0
被浏览
90
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看