Java InetAddress.isReachable()超时

Jer*_*ome 8 java ping inetaddress

我试图找出我的网络上的特定主机是否可访问.我的java代码如下:

InetAddress adr = InetAddress.getByName(host);
if(adr.isReachable(3000)){
    System.out.println(host + " is reachable");
}
Run Code Online (Sandbox Code Playgroud)

这非常有效,但是如果我将超时降低到500毫秒,它将不再指定主机可达.我计划在循环中检查相当多的主机,因此具有低超时非常重要.如果我从Windows命令行手动ping主机,则需要不到10毫秒.

那么为什么Java方法需要更高的超时才能成功?有没有其他选择isReachable()

bre*_*ttw 6

这取决于你的可达性是什么意思.如果您只查找可侦测主机侦听特定端口的内容,则可以打开与该端口的套接字连接(例如,通过检查端口80查找所有HTTP服务器).使用InetAddress.isReachable()是依赖于实现的.根据javadoc,"典型的实现将使用ICMP ECHO REQUESTs".使用Java NIO(非阻塞I/O)的"已知端口"检查(如http(80),smb(445)等)可以具有更高的性能.我公司的产品使用"已知端口"扫描来查找运行Telnet或SSH的盒子,使用NIO,我们可以扫描大约5000 IP /秒.