首页 >Java >java教程 >为什么即使主机可 Ping 通,'InetAddress.isReachable()”有时也会返回 False?

为什么即使主机可 Ping 通,'InetAddress.isReachable()”有时也会返回 False?

Patricia Arquette
Patricia Arquette原创
2024-11-27 19:13:11821浏览

Why Does `InetAddress.isReachable()` Sometimes Return False Even When a Host is Pingable?

调查 InetAddress.isReachable() 的错误可达性

InetAddress 是一个用于处理 IP 地址的 Java 类,提供了各种网络的方法 -相关任务。此类方法之一是 isReachable(),用于确定主机是否可通过网络访问。但是,在某些情况下,即使 ping IP 地址成功,此方法也可能返回 false。

请考虑以下尝试检查主机可达性的代码片段:

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

如果运行此代码时,您可能会遇到 isReachable() 返回 false 的情况,尽管您可以 ping 指定的 IP 地址。

To为了解决这个问题,提出了一种替代方法,该方法保持平台无关性,并利用有关远程计算机上开放端口的信息。

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    // Any Open port on other machine
    // openPort =  22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
    try (Socket soc = new Socket()) {
        soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        return true;
    } catch (IOException ex) {
        return false;
    }
}

通过使用此代码,您可以通过尝试确定主机的可达性建立与该主机上已知开放端口的连接。

更新:

获取更简洁的版本代码片段的详细信息,请参考以下内容:

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    try (Socket soc = new Socket()) {
        soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        return true;
    } catch (IOException ex) {
        return false;
    }
}

通过采用此方法,即使在 InetAddress.isReachable() 无法提供准确指示的情况下,您也可以可靠地确定主机的可达性。

以上是为什么即使主机可 Ping 通,'InetAddress.isReachable()”有时也会返回 False?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn