Frage

Wie überprüfen Sie, ob Sie mit dem Internet über Java herstellen können? Eine Möglichkeit 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 es ist etwas besser geeignet, diese Aufgabe zu erfüllen, insbesondere , wenn Sie tun müssen, um aufeinander folgende Überprüfungen sehr häufig und ein Verlust der Internetverbindung ist sehr wahrscheinlich?

War es hilfreich?

Lösung

Sie sollten an den Ort, dass Ihre tatsächlichen Anwendungsanforderungen verbinden. Ansonsten sind Sie testen, ob Sie eine Verbindung irgendwo irrelevant (Google in diesem Fall) haben.

Insbesondere dann, wenn Sie versuchen, einen Web-Service zu sprechen, und wenn Sie die Kontrolle über den Web-Service sind, dann wäre es eine gute Idee zu sein, eine Art billiger Web-Methode „den Status erhalten“ zu haben. Auf diese Weise haben Sie eine viel bessere Vorstellung davon, ob Ihr „echter“ Ruf ist wahrscheinlich zu arbeiten.

In anderen Fällen nur eine Verbindung zu einem Port zu öffnen, die geöffnet sein sollten kann genug sein, um - oder einen Ping senden. InetAddress.isReachable kann gut sein, eine entsprechende API für Ihre Bedürfnisse hier.

Andere Tipps

Der Code, den Sie grundsätzlich zur Verfügung gestellt, sowie ein Aufruf zu connect sollte ausreichend sein. Also ja, könnte es sein, dass nur Google nicht verfügbar ist, aber eine andere Website, die Sie kontaktieren müssen, ist, auf, aber wie wahrscheinlich ist das? Auch sollte dieser Code nur ausgeführt werden, wenn Sie tatsächlich nicht Ihre externe Ressource zuzugreifen (in einem catch Block zu versuchen, herauszufinden, was die Ursache des Fehlers war), so würde ich sagen, dass, wenn beid externe Ressource von Interesse und Google nicht zur Verfügung stehen die Chancen sind Sie eine netto-Konnektivitätsproblem haben.

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

Die Menschen haben mit INetAddress.isReachable vorgeschlagen. Das Problem ist, dass einige Websites konfigurieren ihre Firewalls ICMP Ping-Nachrichten zu blockieren. So ein „Ping“ kann fehlschlagen, obwohl der Web-Service zugänglich ist.

Und natürlich das Gegenteil ist ebenso wahr. Ein Host auf einen Ping reagieren kann, obwohl der Webserver ist nach unten.

Und natürlich kann eine Maschine direkt auf bestimmten (oder alle) Web-Server aufgrund der lokalen Firewall-Einschränkungen verbinden möglicherweise nicht.

Das grundlegende Problem ist, dass „kann eine Verbindung zum Internet“ ist eine schlecht definierte Frage, und diese Art der Sache ist schwierig, ohne zu testen:

  1. Informationen auf dem Computer des Benutzers und „local“ Netzwerkumgebung, und
  2. Informationen darüber, was die App zugreifen muss.

So im Allgemeinen, ist die einfachste Lösung für eine App nur versuchen, den Zugriff auf alles, was sie zugreifen muss, und fallen zurück auf die menschliche Intelligenz, um die Diagnose zu tun.

Wenn Sie auf Java sind, können 6 verwenden Network nach verfügbaren Netzwerkschnittstellen zu überprüfen. D. h so etwas wie folgt aus:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
  NetworkInterface interf = interfaces.nextElement();
  if (interf.isUp() && !interf.isLoopback())
    return true;
}

Habe es selbst nicht versucht, noch nicht.

Mit diesem Code:

"127.0.0.1".equals(InetAddress.getLocalHost().getHostAddress().toString());

Returns - mir - true wenn offline, und false, sonst. (Na ja, ich weiß nicht, ob dies wahr für alle Computer).

Das funktioniert viel schneller als die anderen Ansätze, hier oben.


EDIT: Ich fand diese nur arbeiten, wenn die „Flip-Schalter“ (auf einem Laptop) oder eine andere systemdefinierte Option, für die Internetverbindung, ausgeschaltet ist. Das ist, das System selbst nicht weiß, für alle IP-Adressen zu suchen.

Dieser Code sollte zuverlässig die Arbeit machen.

Beachten Sie, dass bei der Verwendung der try-with-resources Aussage, die wir don‘ t müssen, um die Ressourcen zu 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;
        }
    }
}

ich es in der Regel brechen sie in drei Schritten.

  1. ich zum ersten Mal sehen, ob ich die Domainnamen in eine IP-Adresse aufgelöst werden kann.
  2. Ich versuche dann über TCP (Port 80 und / oder 443) zu verbinden und schließen anmutig.
  3. Schließlich werde ich eine HTTP-Anforderung ausgeben und prüfen, ob eine 200-Antwort zurück.

Wenn es an irgendeiner Stelle ausfällt, liefere ich die entsprechende Fehlermeldung an den Benutzer.

URL url=new URL("http://[any domain]");
URLConnection con=url.openConnection();

/*now errors WILL arise here, i hav tried myself and it always shows "connected" so we'll open an InputStream on the connection, this way we know for sure that we're connected to d internet */

/* Get input stream */
con.getInputStream();

Setzen Sie die oben genannten Aussagen in Try-Catch-Blöcken und wenn eine Ausnahme in gefangen bedeutet, dass es keine Internet-Verbindung hergestellt. : -)

Der Code Network mit warten, bis das Netzwerk für mich gearbeitet, bis ich aus dem Festnetz-Adresse DHCP geschaltet. Eine leichte Verbesserung macht es arbeitet auch mit DHCP:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
    NetworkInterface interf = interfaces.nextElement();
    if (interf.isUp() && !interf.isLoopback()) {
    List<InterfaceAddress> adrs = interf.getInterfaceAddresses();
    for (Iterator<InterfaceAddress> iter = adrs.iterator(); iter.hasNext();) {
        InterfaceAddress adr = iter.next();
        InetAddress inadr = adr.getAddress();
        if (inadr instanceof Inet4Address) return true;
            }
    }
}

Dies funktioniert für Java 7 in Open Suse 13.1 für IPv4-Netzwerk. Das Problem mit dem Original-Code ist, dass, obwohl die Schnittstelle aktiviert wurde, nachdem aus dem Suspend wieder aufzunehmen, eine Adresse IPv4-Netzwerkes noch nicht vergeben wurde. Nach dieser Zuweisung warten, kann das Programm mit Servern verbinden. Aber ich habe keine Ahnung, was im Fall von IPv6 zu tun.

InetAddress.isReachable irgendwann falsch zurück, wenn Internet-Verbindung vorhanden sein.

Eine alternative Methode Internet-Verfügbarkeit in Java zu überprüfen ist: Diese Funktion ist ein echtes ICMP ECHO ping machen

.
public static boolean isReachableByPing(String host) {
     try{
                String cmd = "";
                if(System.getProperty("os.name").startsWith("Windows")) {   
                        // For Windows
                        cmd = "ping -n 1 " + host;
                } else {
                        // For Linux and OSX
                        cmd = "ping -c 1 " + host;
                }

                Process myProcess = Runtime.getRuntime().exec(cmd);
                myProcess.waitFor();

                if(myProcess.exitValue() == 0) {

                        return true;
                } else {

                        return false;
                }

        } catch( Exception e ) {

                e.printStackTrace();
                return false;
        }
}

1) Finde heraus, wo Ihre Anwendung muss zu verbinden.

2) Stellen Sie einen Arbeitsprozess bis zu überprüfen InetAddress.isReachable die Verbindung zu dieser Adresse zu überwachen.

Dieser Code wird in einer JUnit-Testklasse I zum Testen verwenden, wenn eine Verbindung verfügbar ist. Ich erhalte immer eine Verbindung, aber wenn Sie die Inhaltslänge überprüfen sollte es -1, wenn nicht bekannt ist:

  try {
    URL url = new URL("http://www.google.com");
    URLConnection connection = url.openConnection();

    if(connection.getContentLength() == -1){
          fail("Failed to verify connection");
    }
  } 
  catch (IOException e) {
      fail("Failed to open a connection");
      e.printStackTrace();
  }
public boolean checkInternetConnection()
{
     boolean status = false;
     Socket sock = new Socket();
     InetSocketAddress address = new InetSocketAddress("www.google.com", 80);

     try
     {
        sock.connect(address, 3000);
        if(sock.isConnected()) status = true;
     }
     catch(Exception e)
     {
         status = false;       
     }
     finally
     {
        try
         {
            sock.close();
         }
         catch(Exception e){}
     }

     return status;
}

Es gibt auch eine Option gradle --offline, die vielleicht im Verhalten führen Sie wollen.

Das folgende Stück Code ermöglicht es uns, den Status des Netzwerks auf unserem Android-Gerät zu bekommen

public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView mtv=findViewById(R.id.textv);
            ConnectivityManager connectivityManager=
                  (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if(((Network)connectivityManager.getActiveNetwork())!=null)
                    mtv.setText("true");
                else
                    mtv.setText("fasle");
            }
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top