Java - InetAddress#isReachable 方法解析
文章目录
- 前言
- 代码
- 资源
前言
在 Java 中,InetAddress
类提供一个方法来检查一个网络地址是否可达,其作用类似与在命令行执行 ping
命令,
这个方法就是 isReachable
方法。
代码
var baidu = InetAddress.getByName("www.baidu.com");
var start = System.currentTimeMillis();
if (baidu.isReachable(1000)) {
System.out.printf("%s spend %dms%n", baidu, System.currentTimeMillis() - start);
} else {
// 若在 1000 毫秒内没有收到响应,则会执行到这里
System.out.println("timeout");
}
// www.baidu.com/183.2.172.185 spend 11ms
上面代码就是 InetAddress#isReachable
的用法,注意的是,isReachable
方法在响应前会阻塞。
isReachable
方法通过发送 ICMP Echo 请求到目标主机来实现其功能。如果主机在线并且能够接收到 ICMP Echo 请求,那么它将返回 true
。否则,它将返回 false
。
需要注意的是,这个方法可能会受到防火墙的影响。如果防火墙阻止了 ICMP Echo 请求,那么即使主机在线,isReachable
方法也可能返回 false
。
此外,这个方法只能检测主机是否在线,不能检测主机是否能够通过网络发送数据包。如果你需要检测主机的网络连接状态,你可能需要使用其他的方法。
在 windows 系统中,IPv4 最终通过 IcmpSendEcho
函数实现。
资源
IcmpSendEcho 函数 (icmpapi.h)