Próbuję sprawdzić, czy określone hosty w mojej sieci są osiągalne. Mój kod Java jest w następujący sposób:Java InetAddress.isReachable() timeout
InetAddress adr = InetAddress.getByName(host);
if(adr.isReachable(3000)){
System.out.println(host + " is reachable");
}
Działa to całkiem dobrze, jednak jeśli obniżyć limit czasu do powiedzenia zamiast 500ms, nie wyznacza już host nieosiągalny. Mam zamiar sprawdzić kilka hostów w pętli, więc posiadanie niskiego limitu czasu jest bardzo ważne. Jeśli wykonuję polecenie ping ręcznie hosta z wiersza poleceń systemu Windows, zajmuje to mniej niż 10 ms.
Dlaczego więc metoda Java wymaga znacznie wyższego czasu oczekiwania, aby odnieść sukces? Czy są jakieś alternatywy dla korzystania z isReachable()
?
Dzięki, Zasadniczo tak, chciałbym podłączyć/sprawdzić hosty na porcie 10001, które są używane przez urządzenia, które muszę znaleźć. Czy mógłbyś podać przykład, jak wdrożyć tę znaną kontrolę portu? – Jerome
Nie wdaje się w implementację nieblokującej metody I/O (NIO). Ale powiedziałbym po prostu utworzyć gniazdo. Utwórz adres Socket z docelowym adresem IP i portem 10001. Następnie wywołaj socket.connect (SocketAddress, timeout) z odpowiednim limitem czasu. Catch TimeOutException. Jeśli socket.connect() zwraca się bez wyjątku, zamknij gniazdo, wiesz, że urządzenie nasłuchuje na 10001. Dla modelu NIO, spójrz na projekt Netty open-source i przykłady. – brettw