揭示断开连接:为什么 InetAddress.isReachable() 报告错误
尝试使用 InetAddress.isReachable 确定 IP 地址的可达性时(),尽管能够成功 ping 同一地址,但用户可能会遇到意外的错误响应。这种差异可归因于 isReachable() 实现的限制。
与直接向目标 IP 发送网络数据包的 ping 不同,isReachable() 依赖于一种称为 ICMP(Internet控制消息协议)回显请求。如果在指定的超时时间内未响应 ICMP 请求,即使 IP 仍然可访问,isReachable() 也会返回 false。
提供跨平台解决方案
对于包含一系列连接检查的独立于平台的解决方案,请考虑采用探测目标计算机上开放端口的技术。这种方法利用了这样一个事实:大多数设备都拥有 SSH、Web 服务器或邮件服务器等服务的开放端口。
以下是实现此方法的代码片段:
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; } }
通过利用通过这种技术,您能够确定可达性,而不管底层平台如何,从而确保结果更加一致。
以上是为什么 Ping 成功后 InetAddress.isReachable() 有时也会返回 False?的详细内容。更多信息请关注PHP中文网其他相关文章!