我想要boolean isReachable(String host, int port)
在以下条件下通过以下 JUnit 测试的最快、最准确的函数。超时值由 JUnit 测试本身指定,并且可能被视为“无法访问”。
请注意:所有答案必须与平台无关。这意味着这InetAddress.isReachable(int timeout)
不起作用,因为它依赖端口7
在 Windows 上执行 ping(ICMP ping 在 Windows 上是一个未记录的功能),并且此端口在此设置中被阻止。
局域网设置:
thisMachine
(192.168.0.100
)otherMachine
(192.168.0.200
)- 没有机器被调用
noMachine
或没有 IP192.168.0.222
(总是无法访问) - 两台机器都在端口上运行 Apache Tomcat
8080
;所有其他端口都无法访问(包括 port7
) example.com
(208.77.188.166
) 在端口上运行网络服务器,80
并且仅当 LAN 连接到 Internet 时才可访问
有时,LAN 与 Internet 断开连接,在这种情况下,只能访问由 IP 地址调用的本地计算机(所有其他计算机都无法访问;没有 DNS)。
所有测试都在thisMachine
.
@Test(timeout=1600) // ~320ms per call (should be possible to do better)
public void testLocalhost() {
// We can always reach ourselves.
assertTrue(isReachable("localhost", 8080));
assertTrue(isReachable("127.0.0.1", 8080));
assertTrue(isReachable("thisMachine", 8080)); // Even if there's no DNS!
assertTrue(isReachable("192.168.0.100", 8080));
assertFalse(isReachable("localhost", 80)); // Nothing on that port.
}
@Test(timeout=5500) // ~1867ms per call (should be able to do better)
public void testLAN() {
assertTrue(isReachable("192.168.0.200", 8080)); // Always connected to the LAN.
assertFalse(isReachable("192.168.0.222", 8080)); // No such a machine.
assertFalse(isReachable("noMachine", 8080)); // No such machine.
}
以下测试仅在 LAN与 Internet断开连接时运行。
@Test(timeout=5600) // ~1867ms per call (reasonable?)
public void testNoDNS() {
assertFalse(isReachable("otherMachine", 8080)); // No DNS.
assertFalse(isReachable("example.com", 80)); // No DNS & no Internet.
assertFalse(isReachable("208.77.188.166", 80)); // No Internet.
}
以下测试仅在 LAN连接到 Internet 时运行。
@Test(timeout=5600) // ~1867ms per call (reasonable?)
public void testHaveDNS() {
assertTrue(isReachable("otherMachine", 8080)); // DNS resolves local names.
assertTrue(isReachable("example.com", 80)); // DNS available.
assertTrue(isReachable("208.77.188.166", 80)); // Internet available.
}