2013-06-09 9 views
6

Pracuję nad projektem Java, który musi zawsze mieć połączenie z Internetem.Jak sprawdzić łączność internetową w Javie

Chcę, aby mój program sprawdzał połączenie internetowe w określonych odstępach czasu (powiedzmy 5 lub 10 sekund) i wyświetlał komunikat, gdy tylko nie wykryto połączenia z Internetem.

Próbowałem użyć metody isReachable aby osiągnąć tę funkcjonalność, poniżej jest kod -

try 
{ 
    InetAddress add = InetAddress.getByName("www.google.com"); 
    if(add.isReachable(3000)) System.out.println("Yes"); 
    else System.out.println("No"); 
} 
catch (UnknownHostException e) 
{ 
    System.out.println("unkownhostexception"); 
} 
catch (IOException e) 
{ 
    System.out.println("IoException"); 
} 

Ale ten kod zawsze zwraca „Nie”. Jaki jest problem z tym kodem?

Dzięki

+1

http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping -the-ip-address – uselpa

+0

Dzięki, ale rozwiązanie tam oferowane, nie działa w moim przypadku. autor również powiedział, że tylko włamanie może nie działać w niektórych przypadkach. –

Odpowiedz

9

Jedynym sposobem Jestem świadomy wysyła pakiet do jakiegoś znanego gospodarza, znanego w tym sensie, że wiesz zawsze będzie gotowy do pracy i dostępny od strony wywołującej.

Jednak, na przykład, jeśli wybierzesz nazwanego hosta, polecenie ping może się nie powieść z powodu niepowodzenia wyszukiwania DNS.

Myślę, że nie powinieneś się martwić o ten problem: jeśli twój program potrzebuje połączenia z Internetem, to dlatego, że wysyła lub odbiera dane. Połączenia nie są ciągłe jak rzeka, ale bardziej przypominają drogę. Dlatego wystarczy użyć standardu Java, aby poradzić sobie z błędami połączenia: IOExceptiions. Kiedy Twój program musi przesłać dane, bazowy interfejs API będzie wystawiał certyfikat IOE w przypadku awarii sieci. Jeśli twój program oczekuje danych, zamiast tego użyj limitu czasu lub czegoś podobnego, aby wykryć możliwe błędy w stosie sieci i zgłosić je użytkownikowi.

15

Zgadzam się z sugestią Raffaele, jeśli po prostu trzeba często korzystać z Internetu. Po prostu spróbuj to zrobić i bądź przygotowany na obsługę wyjątków, gdy się nie powiedzie.

Jeśli chcesz monitorować dostępność Internetu z jakiegoś powodu, nawet jeśli nie masz zamiaru go jeszcze używać i nie wiesz z kim się łączysz, po prostu spróbuj nawiązać połączenie z dobrze znanym. witryna (google.com, amazon.com, baidu.com ...).

Będzie to działać, aby przetestować kilka stron:

public static void main(String[] args) { 
    System.out.println(
     "Online: " + 
     (testInet("myownsite.example.com") || testInet("google.com") || testInet("amazon.com")) 
    ); 
} 


public static boolean testInet(String site) { 
    Socket sock = new Socket(); 
    InetSocketAddress addr = new InetSocketAddress(site,80); 
    try { 
     sock.connect(addr,3000); 
     return true; 
    } catch (IOException e) { 
     return false; 
    } finally { 
     try {sock.close();} 
     catch (IOException e) {} 
    } 
} 
+1

tak, robię coś podobnego. Wielkie dzięki ! –

+0

To działa, wielkie dzięki. Metoda testInet() jest tym, co robi. – russellhoff

Powiązane problemy