当前位置: 首页 > 面试题库 >

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

凌通
2023-03-14
问题内容
InetAddress byName = InetAddress.getByName("173.39.161.140");
   System.out.println(byName);
   System.out.println(byName.isReachable(1000));

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


问题答案:

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



 类似资料:
  • 问题内容: 据我所知,使用或实例化对象分别返回或的新实例。具有 新标识 的新实例对象。 在我实际测试它之前,这对我来说是很清楚的,我注意到它实际上返回了而不是预期的: 如预期的那样,分别使用和创建对象时,也会表现出这种行为: 我可以在状态文档中找到唯一相关的信息: […]例如,return和return 。 如果未提供任何参数,则构造函数将创建一个新的空元组。 可以说,这不足以回答我的问题。 那么

  • 问题内容: 我知道Go没有任何构造函数,而是在其中使用a ,但是根据此示例。 他们总是回来。为什么仅仅返回就还不够? 更新资料 我尝试过为简单的结构返回创建的对象,这很好。因此,我想知道返回地址是否是构造函数的标准方法或其他方法。 谢谢。 问题答案: 如前所述,是的,规范允许您返回值(作为非指针)或指针。这只是您必须做出的决定。 什么时候返回指针? 通常,如果您返回的值作为指针“更有用”。什么时候

  • 是否存在这样的编写方法: 而不是这个: 会有意义吗? 当您可以直接返回< code >任务时,为什么要使用< code>return await构造 我在很多地方看到带有的代码,我想我可能错过了一些东西。但据我了解,在这种情况下不使用async/wait关键字并直接返回任务在功能上是等效的。为什么要增加额外的层的额外开销?

  • 在线性回归空间中使用梯度下降有什么好处?看起来我们可以用解析法解决这个问题(找到成本函数最小的θ0-n),那么为什么我们还想用梯度下降法来做同样的事情呢?谢谢

  • 我正在使用JdbcTemplate。query(sql、args、rowMapper)方法调用以返回对象列表。在某些情况下,我希望跳过一行,而不将其添加到返回的列表中。在这些情况下,我想到了两种解决方案: 让行映射器返回null 让RowMapper抛出一个异常(我知道SQLExceptions已被处理,所以这是一种可能性) 我的问题是:当返回null时,JdbcTemboard是否将其添加到列表

  • 我知道这个问题在这里已经被问了无数次了,我已经搜索了SO和其他来源来寻找解决方法,但我就是无法解决这个错误。我的ClientPlayer类属性有一个getter和setter,当某个按钮被调用时setter在GUI中被调用,我希望在客户端连接对象并将对象发送到服务器后使用getter。调用方法“This.client.SendTCP(ClientPlayer.GetPlayerName());”返