我想要在下面的條件下通過以下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.
}