Jaki jest najszybszy sposób na wykrycie nieosiągalnego hosta w Javie?
Chciałbym najszybszą i najdokładniejszą funkcjęboolean isReachable(String host, int port)
który przechodzi następujące testy JUnit w poniższych warunkach. Wartości limitu czasu są określane przez sam test JUnit i mogą być uważane za „nieosiągalne”.
Proszę zanotować: Wszystkie odpowiedzi muszą być niezależne od platformy. To znaczy żeInetAddress.isReachable(int timeout)
nie będzie działać, ponieważ opiera się na porcie7
wykonać ping w systemie Windows (ping ICMP jest nieudokumentowaną funkcją w systemie Windows), a ten port jest zablokowany w tej konfiguracji.
Konfiguracja sieci LAN:
thisMachine
(192.168.0.100
)otherMachine
(192.168.0.200
)Nie nazywa się maszynanoMachine
lub ma adres IP192.168.0.222
(zawsze nieosiągalne)obie maszyny działają na porcie Apache Tomcat8080
; wszystkie inne porty są nieosiągalne (w tym port7
)example.com
(208.77.188.166
) uruchamia serwer WWW na porcie80
i jest osiągalny tylko wtedy, gdy sieć LAN jest podłączona do InternetuCzasami sieć LAN jest odłączana od Internetu, w którym to przypadku dostępne są tylko lokalne maszyny wywoływane przez adres IP (wszystkie inne są nieosiągalne; nie ma DNS).
Wszystkie testy są uruchomionethisMachine
.
@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.
}
Poniższy test jest uruchamiany tylko wtedy, gdy sieć LAN jestniepowiązany z Internetu.
@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.
}
Poniższy test jest uruchamiany tylko wtedy, gdy sieć LAN jestpołączony Do internetu.
@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.
}