¿Cuál es la forma más rápida de detectar un host inalcanzable en Java?

Me gustaría la función más rápida y precisa.boolean isReachable(String host, int port) que pasa las siguientes pruebas de JUnit bajo las siguientes condiciones. Los valores de tiempo de espera están especificados por la prueba JUnit en sí, y pueden considerarse "inaccesibles".

Tenga en cuenta: Todas las respuestas deben ser independientes de la plataforma. Esto significa queInetAddress.isReachable(int timeout) No va a funcionar, ya que depende del puerto.7 para hacer un ping en Windows (el ping ICMP es una función no documentada en Windows), y este puerto está bloqueado en esta configuración.

Configuración de LAN:

thisMachine (192.168.0.100)otherMachine (192.168.0.200)no máquina se llamanoMachine o tiene la IP192.168.0.222 (siempre inalcanzable)ambas máquinas están ejecutando Apache Tomcat en el puerto8080; todos los demás puertos son inalcanzables (incluido el puerto7)example.com (208.77.188.166) está ejecutando un servidor web en el puerto80 y solo es accesible cuando la LAN está conectada a Internet

Ocasionalmente, la LAN se desconecta de Internet, en cuyo caso solo se puede acceder a las máquinas locales llamadas por dirección IP (no se puede acceder a todas las demás; no hay DNS).

Todas las pruebas se ejecutan enthisMachine.

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

La siguiente prueba solo se ejecuta cuando la LAN esdesconectado desde 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.
}

La siguiente prueba solo se ejecuta cuando la LAN esconectado a la 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.
}

Respuestas a la pregunta(6)

Su respuesta a la pregunta