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 Internetu

Czasami 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.
}

questionAnswers(6)

yourAnswerToTheQuestion