Java InetAddress.isReachable()超时

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

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

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

那么为什么Java方法需要更高的超时才能成功? 有没有替代方法使用isReachable()

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