首页 > Java > java教程 > 为什么 Ping 成功但'InetAddress.isReachable()”返回 False?

为什么 Ping 成功但'InetAddress.isReachable()”返回 False?

Mary-Kate Olsen
发布: 2024-12-07 01:58:12
原创
1002 人浏览过

Why Does `InetAddress.isReachable()` Return False Even Though Ping Succeeds?

尽管 Ping 成功,为什么 inetAddress.isReachable() 返回 False

您的代码检索特定 IP 地址的 InetAddress 实例,然后调用其isReachable() 方法,超时时间为 1000毫秒:

InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));
登录后复制

然而,令人惊讶的是,即使您可以成功 ping 通 IP 地址,isReachable() 也会返回 false。

原因和解决方案

原因:

isReachable() 不依赖于 ping 命令或任何其他特定于操作系统的工具。相反,它使用 ICMP 协议通过发送 ICMP Echo Request 消息并等待 ICMP Echo Reply 消息来检查主机是否可达。某些系统可能会阻止 ICMP 流量,导致 isReachable() 方法失败。

解决方案:

要在不依赖 isReachable() 的情况下确定可达性,可以使用以下 Java 代码:

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;
    }
}
登录后复制

此方法尝试连接到远程计算机上指定的开放端口。如果连接成功,则说明主机可达。开放端口可以是通常可访问的任何端口,例如 SSH 的 22、HTTP 的 80 或 HTTPS 的 443。

以上是为什么 Ping 成功但'InetAddress.isReachable()”返回 False?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板