Wie überprüfe ich, ob eine Internetverbindung in Java vorhanden ist?
Lesezeit: 7 Minuten
Chris
Wie überprüfen Sie, ob Sie über Java eine Verbindung zum Internet herstellen können? Ein Weg wäre:
final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
... if we got here, we should have net ...
Aber gibt es etwas Geeigneteres, um diese Aufgabe zu erfüllen, besonders wenn Sie tun müssen aufeinanderfolgende Kontrollen sehr oft und ein Verlust der Internetverbindung ist sehr wahrscheinlich?
Die Antwort darauf ist die gleiche wie auf viele andere Fragen der gleichen Form. Der einzig richtige Weg, um festzustellen, ob eine Ressource verfügbar ist, besteht darin, zu versuchen, sie im normalen Ablauf der Ausführung zu verwenden und mit Fehlern fertig zu werden, sobald sie auftreten. Jede andere Technik ist die eine oder andere Form des Versuchs, die Zukunft vorherzusagen.
– Benutzer207421
4. Dezember 14 um 20:54 Uhr
Jon Skeet
Sie sollten sich mit dem Ort verbinden, den Ihre eigentliche Anwendung benötigt. Andernfalls testen Sie, ob Sie eine Verbindung zu einem irrelevanten Ort haben (in diesem Fall Google).
Insbesondere wenn Sie versuchen, mit einem Webdienst zu kommunizieren, und wenn Sie die Kontrolle über den Webdienst haben, wäre es eine gute Idee, eine Art billige Webmethode zum Abrufen des Status zu haben. Auf diese Weise haben Sie eine viel bessere Vorstellung davon, ob Ihr “echter” Anruf wahrscheinlich funktionieren wird.
In anderen Fällen kann es ausreichen, nur eine Verbindung zu einem Port zu öffnen, der offen sein sollte – oder einen Ping zu senden. InetAddress.isReachable könnte hier eine geeignete API für Ihre Bedürfnisse sein.
Was ist, wenn Sie eine Verbindung zu einer Ressource herstellen, mit der Sie kommunizieren möchten, und dies fehlschlägt? Woher wissen Sie, dass es das Problem des Zielservers war und nicht bcs, dass keine Internetverbindung bestand? “Verbinden Sie sich mit dem Ort, den Ihre tatsächliche Anwendung benötigt” ist also nicht wirklich eine Lösung, die keine zuverlässige Überprüfung wäre
– Chris
10. September 09 um 0:39 Uhr
@Chris: Es kommt darauf an, ob es dich wirklich interessiert, was das Problem ist. Ich stimme zu, dass Sie weitere Diagnoseinformationen erhalten können, wenn Sie (nach einem Fehler) auch eine andere Verbindung herstellen. Aber die wichtigste Information ist sicherlich “Kann ich die Ressource verwenden, die ich zu verwenden versuche?”
– Jon Skeet
10. September 2009 um 5:20 Uhr
@ Pacerier: Es gibt viele verschiedene Dinge, die schief gehen können, und Diagnosen wo Es gibt ein Problem ist eine heikle Angelegenheit. Was wäre, wenn Sie nichts unternommen hätten, aber die Leitung Ihres ISP zum Rest der Welt ausgefallen wäre? Dann haben Sie möglicherweise immer noch eine einwandfrei gültige Routerverbindung usw. – und Sie können möglicherweise sogar auf die Domäne Ihres ISP zugreifen -, könnten jedoch keine anderen Websites erreichen. Alles, was ich sage, ist: “Ist mein Internet aktiv?” macht als Frage eigentlich keinen Sinn – nicht genau. Was sind Sie schlägt der Test sein sollte?
– Jon Skeet
18. Januar 12 um 7:22 Uhr
@ Pacerier: Sie würden also mehrere Websites ausprobieren, die normalerweise aktiv sind. Sie sollten auch überprüfen, ob die DNS-Auflösung funktioniert – und ob facebook.com überhaupt aufgelöst werden konnte. Dann besteht die Möglichkeit, dass Facebook für einen großen Teil der Benutzer ausgefallen ist (z. B. der Datenverkehr für ein Land geht zu einem Rechenzentrum, das Probleme hat), ohne dass die Website vollständig ausgefallen ist …
– Jon Skeet
18. Januar 12 um 7:35 Uhr
Marcus Junius Brutus
Der Code, den Sie im Grunde bereitgestellt haben, plus ein Aufruf an connect sollte ausreichen. Also ja, es könnte sein, dass nur Google nicht verfügbar ist, aber eine andere Website, die Sie kontaktieren müssen, vorhanden ist, aber wie wahrscheinlich ist das? Außerdem sollte dieser Code nur ausgeführt werden, wenn Sie tatsächlich nicht auf Ihre externe Ressource zugreifen können (in a catch blockieren, um herauszufinden, was die Ursache des Fehlers war), also würde ich sagen, dass beide Ihre externe Ressource von Interesse sind und Google ist nicht verfügbar. Möglicherweise haben Sie ein Problem mit der Internetverbindung.
private static boolean netIsAvailable() {
try {
final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
conn.connect();
conn.getInputStream().close();
return true;
} catch (MalformedURLException e) {
throw new RuntimeException(e);
} catch (IOException e) {
return false;
}
}
Dies funktioniert, dauert aber eine Weile, bis es zurückkehrt false. Irgendeine schnellere Lösung? Cmd sagt mir sofort, dass der Host nicht gefunden werden konnte, wenn ich versuche, ihn zu pingen.
– BullyWiiPlaza
22. März 15 um 21:09 Uhr
Stefan C
Es wurde vorgeschlagen, INetAddress.isReachable zu verwenden. Das Problem ist, dass einige Sites ihre Firewalls so konfigurieren, dass ICMP-Ping-Nachrichten blockiert werden. Daher kann ein “Ping” fehlschlagen, obwohl auf den Webdienst zugegriffen werden kann.
Und umgekehrt gilt natürlich auch. Ein Host kann auf einen Ping antworten, obwohl der Webserver heruntergefahren ist.
Und natürlich kann ein Computer aufgrund lokaler Firewall-Einschränkungen möglicherweise keine direkte Verbindung zu bestimmten (oder allen) Webservern herstellen.
Das grundlegende Problem besteht darin, dass „kann eine Verbindung zum Internet herstellen“ eine schlecht definierte Frage ist und solche Dinge schwer zu testen sind, ohne:
Informationen über den Computer des Benutzers und die “lokale” Netzwerkumgebung und
Informationen darüber, worauf die App zugreifen muss.
Im Allgemeinen besteht die einfachste Lösung darin, dass eine App einfach versucht, auf alles zuzugreifen, was sie benötigt, und auf die menschliche Intelligenz zurückgreift, um die Diagnose durchzuführen.
gut, nicht schlecht definiert. Die Frage ist nur “Gibt es Internet”, mehr nicht.
– Chris
10. September 09 um 0:43 Uhr
Das ist mein Punkt. Die Frage “gibt es Internet” ist schlecht definiert. Lesen Sie den obigen Text für Beispiele, die dies veranschaulichen sollen.
– Stefan C
10. September 2009 um 4:07 Uhr
@Chris: “Internet” ist schlecht definiert. Die Möglichkeit, zu Google zu gelangen, bedeutet beispielsweise nicht, dass Sie auch woanders hinkommen müssen. (Stellen Sie sich vor, der DNS-Server ist ausgefallen, aber Sie haben zufällig einen DNS-Eintrag in Ihrer Hosts-Datei.)
– Jon Skeet
10. September 2009 um 5:22 Uhr
Und wenn Sie Google nicht erreichen können, heißt das nicht, dass Sie nicht dorthin gelangen können, wo der Benutzer eigentlich hin möchte.
– Stefan C
10. September 09 um 5:33 Uhr
@ Stephen C: ok, jetzt habe ich den Punkt verstanden. Vielleicht muss ich einen anderen Weg versuchen, um meine Bedürfnisse zu erfüllen. thxn für Kommentare.
– Chris
10. September 2009 um 9:43 Uhr
Wenn Sie Java 6 verwenden können Netzwerkschnittstelle um nach verfügbaren Netzwerkschnittstellen zu suchen. Dh so etwas:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface interf = interfaces.nextElement();
if (interf.isUp() && !interf.isLoopback())
return true;
}
Habe es selber noch nicht probiert.
BullyWiiPlaza
Dieser Code sollte die Arbeit zuverlässig erledigen.
Beachten Sie, dass bei der Verwendung von try-with-resources Anweisung müssen wir die Ressourcen nicht schließen.
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class InternetAvailabilityChecker
{
public static boolean isInternetAvailable() throws IOException
{
return isHostAvailable("google.com") || isHostAvailable("amazon.com")
|| isHostAvailable("facebook.com")|| isHostAvailable("apple.com");
}
private static boolean isHostAvailable(String hostName) throws IOException
{
try(Socket socket = new Socket())
{
int port = 80;
InetSocketAddress socketAddress = new InetSocketAddress(hostName, port);
socket.connect(socketAddress, 3000);
return true;
}
catch(UnknownHostException unknownHost)
{
return false;
}
}
}
Gibt – an mich – zurück true wenn offline, und false, ansonsten. (Nun, ich weiß nicht, ob dies für alle Computer gilt).
Das geht viel schneller als die anderen Ansätze hier oben.
BEARBEITEN: Ich habe festgestellt, dass dies nur funktioniert, wenn der “Kippschalter” (auf einem Laptop) oder eine andere systemdefinierte Option für die Internetverbindung ausgeschaltet ist. Das heißt, das System selbst weiß, dass es nicht nach IP-Adressen suchen soll.
Markus Adams
Normalerweise unterteile ich es in drei Schritte.
Ich sehe zuerst, ob ich den Domänennamen in eine IP-Adresse auflösen kann.
Ich versuche dann, mich über TCP (Port 80 und/oder 443) zu verbinden und ordnungsgemäß zu schließen.
Abschließend gebe ich eine HTTP-Anfrage aus und überprüfe, ob eine 200-Antwort zurückkommt.
Wenn es an irgendeinem Punkt fehlschlägt, gebe ich dem Benutzer die entsprechende Fehlermeldung.
Ich denke, das ist vielleicht eine gute Antwort, aber können Sie das näher erläutern, weil es im Moment keine gute Antwort ist.
– Schrittmacher
18. Januar 12 um 6:55 Uhr
.
7587400cookie-checkWie überprüfe ich, ob eine Internetverbindung in Java vorhanden ist?yes
Die Antwort darauf ist die gleiche wie auf viele andere Fragen der gleichen Form. Der einzig richtige Weg, um festzustellen, ob eine Ressource verfügbar ist, besteht darin, zu versuchen, sie im normalen Ablauf der Ausführung zu verwenden und mit Fehlern fertig zu werden, sobald sie auftreten. Jede andere Technik ist die eine oder andere Form des Versuchs, die Zukunft vorherzusagen.
– Benutzer207421
4. Dezember 14 um 20:54 Uhr