Мне нужна самая быстрая и точная функция boolean isReachable(String host, int port)
, которая проходит следующие тесты JUnit при следующих условиях. Значения времени ожидания определяются самим тестом JUnit и могут считаться «недоступными».
Обратите внимание: Все ответы должны быть независимыми от платформы. Это означает, что InetAddress.isReachable(int timeout)
не будет работать, поскольку для проверки связи с Windows используется порт 7
(проверка подлинности ICMP является недокументированной функцией в Windows), и этот порт заблокирован в этой настройке.
Настройка локальной сети:
thisMachine
(192.168.0.100
)
otherMachine
(192.168.0.200
)
- нет аппарат называется
noMachine
или имеет IP 192.168.0.222
(всегда недоступен)
- обе машины работают под управлением Apache Tomcat через порт
8080
; все остальные порты недоступны (включая порт 7
)
example.com
(208.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.
}