Qual é a maneira mais rápida de detectar um host inacessível em Java?

Eu gostaria da função mais rápida e precisaboolean isReachable(String host, int port) que passa nos seguintes testes JUnit sob as condições abaixo. Os valores de tempo limite são especificados pelo próprio teste JUnit e podem ser considerados "inacessíveis".

Observe: Todas as respostas devem ser independentes de plataforma. Isso significa queInetAddress.isReachable(int timeout) não vai funcionar, pois depende da porta7 para fazer um ping no Windows (ping ICMP sendo uma função não documentada no Windows), e esta porta está bloqueada nesta configuração.

Configuração da LAN:

thisMachine (192.168.0.100)otherMachine (192.168.0.200)não máquina é chamadanoMachine ou tem o IP192.168.0.222 (sempre inacessível)ambas as máquinas estão executando o Apache Tomcat na porta8080; todas as outras portas são inacessíveis (incluindo porta7)example.com (208.77.188.166) está executando um servidor na porta80 e só é alcançável quando a LAN está conectada à Internet

Ocasionalmente, a LAN é desconectada da Internet, caso em que apenas as máquinas locais, chamadas por endereço IP, podem ser acessadas (todas as outras estão inacessíveis; não há DNS).

Todos os testes são executados emthisMachine.

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

O seguinte teste só é executado quando a LAN édesconectado da 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.
}

O seguinte teste só é executado quando a LAN éconectado para 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.
}

questionAnswers(6)

yourAnswerToTheQuestion