Java InetAddress.isReachable()超时

时间:2012-03-04 14:12:41

标签: java ping inetaddress

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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