Question

Comment vérifier si vous pouvez vous connecter à Internet via Java? Une solution serait:

final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
... if we got here, we should have net ...

Mais y a-t-il quelque chose de plus approprié pour effectuer cette tâche, en particulier si vous devez effectuer des contrôles consécutifs et qu'une perte de connexion Internet est hautement probable?

Était-ce utile?

La solution

Vous devez vous connecter à l'endroit où votre application a réellement besoin. Sinon, vous testez si vous avez une connexion à un lieu non pertinent (Google dans ce cas).

En particulier, si vous essayez de parler à un service Web et si vous en contrôlez le service, il serait judicieux de disposer d'une sorte de solution bon marché "Obtenir le statut". méthode web. De cette façon, vous avez une bien meilleure idée de savoir si votre "réel" appel est susceptible de fonctionner.

Dans d'autres cas, le simple fait d'ouvrir une connexion à un port qui devrait être ouvert peut suffire - ou d'envoyer un ping. InetAddress.isReachable pourrait bien être ici une API adaptée à vos besoins.

Autres conseils

Le code que vous avez fourni, plus un appel à connect devrait suffire. Donc oui, il se peut que Google ne soit pas disponible mais que vous ayez besoin de contacter un autre site, mais quelle est sa probabilité? En outre, ce code ne doit être exécuté que lorsque vous ne parvenez pas à accéder à votre ressource externe (dans un bloc catch pour essayer de déterminer la cause de l'échec). Je dirais donc que si votre ressource externe d’intérêt et Google ne sont pas disponibles, il est probable que vous rencontriez un problème de connectivité Internet.

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

Des personnes ont suggéré d'utiliser INetAddress.isReachable. Le problème est que certains sites configurent leurs pare-feu pour bloquer les messages ICMP Ping. Donc, un " ping " peut échouer même si le service Web est accessible.

Et bien sûr, l'inverse est également vrai. Un hôte peut répondre à un ping même si le serveur Web est arrêté.

Et bien sûr, une machine peut ne pas être en mesure de se connecter directement à certains serveurs Web (ou à tous) en raison des restrictions du pare-feu local.

Le problème fondamental est que "vous pouvez vous connecter à Internet". est une question mal définie, et ce genre de chose est difficile à tester sans:

  1. informations sur la machine de l'utilisateur et "local" environnement de réseau et
  2. informations sur les éléments auxquels l'application doit accéder.

En règle générale, la solution la plus simple consiste pour une application à simplement essayer d'accéder à toutes les informations dont elle a besoin et à faire appel à l'intelligence humaine pour établir le diagnostic.

Si vous utilisez Java 6, vous pouvez utiliser NetworkInterface. pour vérifier les interfaces réseau disponibles. C'est à dire. quelque chose comme ceci:

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

Je n'ai pas encore essayé moi-même.

Ce code:

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

Renvoie - à moi - true si hors ligne, et false , sinon. (bon, je ne sais pas si cela est vrai pour tous les ordinateurs).

Cela fonctionne beaucoup plus vite que les autres approches, ici.

EDIT: J'ai trouvé que cela ne fonctionnait que si le "commutateur à bascule" (sur un ordinateur portable) ou une autre option définie par le système, pour la connexion Internet, est désactivée. En effet, le système lui-même sait qu'il ne faut rechercher aucune adresse IP.

Ce code devrait faire le travail de manière fiable.

Notez que lors de l'utilisation de try-with-resources , nous n'avons pas besoin de fermer les ressources.

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

Je le décompose généralement en trois étapes.

  1. Je vois d'abord si je peux résoudre le nom de domaine en une adresse IP.
  2. J'essaie ensuite de me connecter via TCP (port 80 et / ou 443) et de fermer en douceur.
  3. Enfin, je vais émettre une requête HTTP et vérifier la réponse 200.

Si cela échoue à un moment donné, je fournis le message d'erreur approprié à l'utilisateur.

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();

Mettez les déclarations ci-dessus dans try catch blocks et si une exception dans catch signifie qu'aucune connexion Internet n'est établie. : -)

Le code utilisant NetworkInterface pour attendre que le réseau fonctionne pour moi jusqu’à ce que je passe de l’adresse réseau fixe à DHCP. Une légère amélioration le rend également compatible avec 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;
            }
    }
}

Ceci fonctionne pour Java 7 dans openSuse 13.1 pour le réseau IPv4. Le problème avec le code d'origine est que, même si l'interface était active après la reprise de la suspension, une adresse réseau IPv4 n'était pas encore attribuée. Après avoir attendu cette affectation, le programme peut se connecter aux serveurs. Mais je ne sais pas quoi faire dans le cas d'IPv6.

InetAddress.isReachable renvoie parfois false si la connexion Internet existe.

Une autre méthode pour vérifier la disponibilité d'Internet en Java est la suivante: Cette fonction crée un véritable ping ICMP ECHO .

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) Déterminez où votre application doit se connecter.

2) Configurez un processus de travail pour vérifier InetAddress.isReachable pour surveiller la connexion à cette adresse.

Ce code est contenu dans une classe de test jUnit que j’utilise pour vérifier si une connexion est disponible. Je reçois toujours une connexion, mais si vous vérifiez la longueur du contenu, il devrait être égal à -1 si vous ne le connaissez pas:

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

Il existe également une option de dégradé - hors connexion qui peut entraîner le comportement souhaité.

Le code suivant nous permet d’obtenir l’état du réseau sur notre appareil Android

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");
            }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top