Какой самый быстрый способ обнаружить недоступный хост в Java?

Я хотел бы самую быструю и точную функциюboolean isReachable(String host, int port) который проходит следующие тесты JUnit при следующих условиях. Значения времени ожидания определяются самим тестом JUnit и могут рассматриваться какнедостижим «.

Пожалуйста, обратите внимание: Все ответы должны быть независимыми от платформы. Это означает, чтоInetAddress.isReachable(int timeout) не собирается работать, так как полагается на порт7 выполнить пинг в Windows (пинг ICMP является недокументированной функцией в Windows), и этот порт заблокирован в этой настройке.

Настройка локальной сети: () ()

thisMachine192.168.0.100otherMachine192.168.0.200нет машина называетсяnoMachine или имеет IP192.168.0.222 (всегда недоступен)обе машины работают под управлением Apache Tomcat по порту8080; все остальные порты недоступны (включая порт) (7example.com208.77.188.166) работает веб-сервер на порт80 и доступен только тогда, когда локальная сеть подключена к Интернету

Иногда локальная сеть отключается от Интернета, и в этом случае доступны только локальные машины, вызываемые по IP-адресу (все остальные недоступны;нет DNS).

Все тесты запущены.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.
}

Следующий тест выполняется только тогда, когда локальная сетьотсоединены из Интернета.

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

Следующий тест выполняется только тогда, когда локальная сетьсвязано в интернет.

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

Ответы на вопрос(6)

Ваш ответ на вопрос