8

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

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

这工作得很好,但是如果我将超时时间降低到 500 毫秒,它将不再指定主机可达。我计划在一个循环中检查相当多的主机,因此低超时非常重要。如果我从 Windows 命令行手动 ping 主机,它需要不到 10 毫秒。

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

4

1 回答 1

6

这取决于您所说的可达性。如果您只找到在特定端口上侦听的可访问主机,则可以打开到该端口的套接字连接(例如,通过检查端口 80 来查找所有 HTTP 服务器)。使用 InetAddress.isReachable() 取决于实现。根据 javadoc,“典型的实现将使用 ICMP ECHO REQUEST”。使用 Java NIO(非阻塞 I/O)的“已知端口”检查(如 http(80)、smb (445) 等)可以具有更高的性能。我的公司有一个产品,它使用“已知端口”扫描来查找运行 Telnet 或 SSH 的机器,使用 NIO,我们可以扫描大约 5000 个 IP/秒。

于 2012-03-04T14:30:51.430 回答