Me gustaría obtener la función más rápida y precisa boolean isReachable(String host, int port)
que pase las siguientes pruebas de JUnit en las condiciones siguientes. Los valores de tiempo de espera se especifican mediante la prueba JUnit en sí misma, y pueden considerarse "inalcanzables".¿Cuál es la forma más rápida de detectar un host inalcanzable en Java?
Tenga en cuenta: Todas las respuestas deben ser independientes de la plataforma. Esto significa que InetAddress.isReachable(int timeout)
no funcionará, ya que depende del puerto 7
para hacer un ping en Windows (ICMP ping es una función no documentada en Windows), y este puerto está bloqueado en esta configuración. Configuración
LAN:
thisMachine
(192.168.0.100
)otherMachine
(192.168.0.200
)- ninguna máquina se llama
noMachine
o tiene la IP192.168.0.222
(siempre inalcanzable) - ambas máquinas están funcionando Apache Tomcat en el puerto
8080
; todos los demás puertos son inalcanzables (incluyendo el puerto7
) example.com
(208.77.188.166
) se está ejecutando un servidor web en el puerto80
y es solamente accesible cuando la LAN está conectado a Internet
De vez en cuando, la LAN está desconectado de la 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 en 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.
}
La siguiente prueba sólo se ejecuta cuando la LAN está desconectado 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 sólo se ejecuta cuando la LAN está conectada a 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.
}