我想要在下面的条件下通过以下JUnit测试的最快和最准确的函数boolean isReachable(String host, int port)
。超时值由JUnit测试本身指定,并可能被视为“无法访问”。什么是在Java中检测无法访问的主机的最快方法?
请注意:所有答案必须是平台无关的。这意味着,InetAddress.isReachable(int timeout)
是行不通的,因为它依赖于端口7
做Windows上的平(ICMP的ping是Windows上的无证功能),而这个端口被阻止在此设置。
LAN设置:
thisMachine
(192.168.0.100
)otherMachine
(192.168.0.200
)- 没有机器叫做
noMachine
或具有 - 两台机器正在运行的IP
192.168.0.222
(总是无法访问)端口8080
上的Apache Tomcat;所有其它端口都无法访问(包括端口7
) example.com
(208.77.188.166
)正在运行在端口80
一个网络服务器和当LAN连接到因特网
有时候是仅可到达的,LAN从断开互联网在这种情况下只有通过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.
}
以下测试仅运行。
@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是连接到因特网以下测试仅运行。
@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.
}