2013-06-09 11 views
6

Ich arbeite an einem Java-Projekt, das immer eine Internetverbindung haben muss.Wie überprüfe ich die Internetverbindung in Java?

Ich möchte, dass mein Programm die Internetverbindung in bestimmten Zeitabständen (etwa 5 oder 10 Sekunden) überprüft und eine Nachricht anzeigt, sobald keine Internetverbindung mehr erkannt wird.

Ich habe versucht, die isReachable Methode zu verwenden, um diese Funktionalität zu erreichen, unten ist der Code -

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"); 
} 

Aber dieser Code gibt immer „Nein“. Was ist das Problem mit diesem Code?

Dank

+1

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

+0

Danke aber die dort angebotene lösung funktioniert bei mir nicht. der Autor sagte auch, dass nur ein Hack in einigen Fällen nicht funktioniert. –

Antwort

9

Der einzige Weg, ich bin bewusst ist, ein Paket zu einigen bekannten Host zu senden, in dem Sinne, ist bekannt, dass Sie wissen, es und läuft und erreichbar von der rufenden Seite immer sein.

Wenn Sie beispielsweise einen benannten Host auswählen, schlägt der Ping möglicherweise aufgrund eines DNS-Lookup-Fehlers fehl.

Ich denke, Sie sollten sich nicht um dieses Problem kümmern: Wenn Ihr Programm eine Internetverbindung benötigt, ist es, weil es Daten sendet oder empfängt. Verbindungen sind kein kontinuierliches Konzept wie ein Fluss, aber sind eher wie eine Straße. Verwenden Sie einfach den Java-Standard für den Umgang mit Verbindungsfehlern: IOExceptiions. Wenn Ihr Programm Daten senden muss, wird die zugrunde liegende API im Falle eines Netzwerkausfalls automatisch einen IOE auslösen. Wenn Ihr Programm Daten erwartet, verwenden Sie stattdessen eine Zeitüberschreitung oder Ähnliches, um mögliche Fehler im Netzwerkstapel zu erkennen und dem Benutzer zu melden.

15

Ich stimme mit Raffaele Vorschlag, wenn Sie nur das Internet häufig verwenden müssen. Versuchen Sie es einfach, und seien Sie bereit, die Ausnahmen zu behandeln, wenn es nicht funktioniert.

Wenn Sie aus irgendeinem Grund die Verfügbarkeit des Internets überwachen müssen, auch wenn Sie es noch nicht verwenden möchten und nicht wissen, mit wem Sie sich verbinden, versuchen Sie einfach eine Verbindung zu einem bekannten Gerät Website (google.com, amazon.com, baidu.com ...).

Dies wird ein paar Seiten zu testen arbeiten:

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

Ja, ich mache etwas ähnliches. Danke vielmals ! –

+0

Das funktioniert, vielen Dank. Die Methode testInet() ist der Trick. – russellhoff

Verwandte Themen