2011-10-07 14 views
16

Chcę przetestować, czy zdalny system jest osiągalny za pomocą Javy, lub innymi słowy "wyślij ping" za pomocą Java. Funkcjonalność ta powinna być zawarta w sposób o wartości logicznej, na przykładJak sprawdzić, czy zdalny system jest osiągalny?

public boolean isReachable(String ip) { 
    // what to do :-) 
} 

Mam badanej klasy Process Java, ale nie sądzę, że jest to najlepszy sposób, aby to zrobić, ponieważ kompleksu obsługa wyjścia z OutputBuffers.

Process proc = Runtime.getRuntime().exec("ping " + ip); 

Inną możliwością byłoby stworzenie połączenia z gniazdem i uchwyt rzucane wyjątki, ale jeśli zdalny system jest „goły” system UNIX, nie może być żadnych Gniazdo na drugiej stronie :-) Dodatkowo ja lubię móc ustawić limit czasu, kiedy zdalny system nie jest osiągalny.

Jak mogę to zrobić? Dziękuję Ci!

+0

W jakim celu? Jeśli jest tam serwer, z którym chcesz się połączyć, po prostu spróbuj się połączyć. – EJP

Odpowiedz

34
InetAddress.getByName(ip).isReachable(timeout); 
+1

OMG! Dziękuję bardzo :-) DOKŁADNIE to, czego szukałem! – strauberry

+5

Czy możemy sprawdzić, czy określony port jest osiągalny? – tasomaniac

+0

@tasomaniac wypróbuj coś takiego: http://pastebin.com/DuwZ6s5E (untested) – scotty86

9

InetAddress.getByName(host).isReachable(timeOut) (obserwowane here)

+6

isReachable() nie można ufać, aby niezawodnie pingować hosty poza lokalną podsiecią. Najbardziej prawdopodobną przyczyną jest użycie przez program Windows ping ICMP, podczas gdy funkcja isReachable() nie może go użyć. Dotyczy to przynajmniej wersji Java 6. – flash

+5

Istnieje komentarz w natywnej implementacji metody 'isReachable0' (w Inet4AddressImpl.c), która mówi:" Wdrożenie systemu ICMP i gniazd RAW na razie jest zbyt niewiarygodne. w ogóle go wypróbować i polegać tylko na TCP. Możemy w przyszłości ponownie włączyć i włączyć ten kod ". ' –

+0

Potwierdzone, w moim komputerze testowym WXP ta komenda domyślnie przyjmuje połączenie TCP na porcie 7 (echo). Zwraca osiągalne, nawet dla adresów IP, które nie istnieją lub z zaporą blokowaną. –

4

Wygląda jak używasz Linuksa więc prawdopodobnie okaże się, że isReachable() jest zawodna (ponieważ nie masz uprawnień do wysyłania pakietów ICMP, a bardzo kilka serwerów ma uruchomioną usługę Echo).

Jeśli tak jest, to myślę, że będzie trzeba użyć zapoczątkować proces w sposób sugerować, ale zaleca się używanie polecenia jak:

ping -c 1 hostname 

ten wygasa po jednej próbie i możesz wtedy sprawdzić status wyjścia procesu - znacznie bardziej niezawodny niż analizowanie standardowego wyjścia.

Ping zwraca 0, aby odnieść sukces niezależnie od zera.

+0

Dziękuję bardzo za radę! Stworzę wpis w bugtracker jako "ulepszenie" :-) – strauberry

0

Wiem, że to pytanie znalazło odpowiedź, ale chciałbym dodać mój kod tylko do "kopiuj-wklej".

public boolean isIpReachable(String ip, int timeout){ 
    boolean state = false; 

    try { 
     state = InetAddress.getByName(ip).isReachable(timeout); 
    } catch (IOException e) { 
     //Parse error here 
    } 

    return state; 
} 
Powiązane problemy