72 votes

Comment vérifier si la connexion Internet est présente dans Java ?

Comment vérifier si vous pouvez vous connecter à l'internet via java ? Une façon serait :

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

Mais existe-t-il quelque chose de plus approprié pour accomplir cette tâche ? notamment si vous devez faire contrôles consécutifs très souvent et qu'une perte de connexion internet est très probable ?

0 votes

La réponse à cette question est la même que pour de nombreuses autres questions de la même forme. La seule façon correcte de déterminer si une ressource est disponible est d'essayer de l'utiliser, dans le cours normal de l'exécution, et de faire face aux échecs lorsqu'ils se produisent. Toute autre technique consiste, sous une forme ou une autre, à essayer de prédire l'avenir.

56voto

Jon Skeet Points 692016

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

En particulier, si vous essayez de parler à un service web, et si vous contrôlez le service web, ce serait une bonne idée d'avoir une sorte de méthode web bon marché pour "obtenir le statut". De cette façon, vous aurez une bien meilleure idée de la probabilité que votre appel "réel" fonctionne.

Dans d'autres cas, il suffit d'ouvrir une connexion vers un port qui devrait être ouvert - ou d'envoyer un ping. InetAddress.isReachable pourrait bien être une API appropriée pour vos besoins ici.

3 votes

Le lien vers isReachable allait vers la mauvaise classe. C'est à java.sun.com/javase/6/docs/api/java/net/

19 votes

Que se passe-t-il si vous vous connectez à une ressource avec laquelle vous voulez communiquer et qu'elle échoue ? comment savez-vous que c'était le problème du serveur cible et non celui de l'absence de connexion internet ? donc "connectez-vous à l'endroit dont votre application a réellement besoin" n'est pas vraiment une solution qui ne serait pas une vérification fiable.

4 votes

@Chris : Cela dépend si vous vous souciez vraiment de savoir quel est le problème. Je suis d'accord que vous pouvez obtenir plus d'informations de diagnostic si (après une panne) vous vous connectez également ailleurs. Mais l'information la plus importante est sûrement "Puis-je utiliser la ressource que j'essaie d'utiliser ?".

28voto

Le code que vous avez fourni à la base, plus un appel à connect devrait être suffisant. Alors oui, il se peut que Google ne soit pas disponible mais qu'un autre site que vous devez contacter le soit, mais quelle en est la probabilité ? De plus, ce code ne devrait s'exécuter que lorsque vous ne parvenez pas à accéder à votre ressource externe (dans un fichier de type catch pour essayer de comprendre la cause de l'échec). Je dirais donc que si votre ressource externe d'intérêt est la suivante y Google ne sont pas disponibles, il est probable que vous ayez un problème de connectivité au réseau.

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

0 votes

Cela fonctionne mais prend un certain temps avant de revenir false . Une solution plus rapide ? Cmd m'indique immédiatement que l'hôte n'a pas pu être trouvé lorsque j'essaie de lui envoyer un ping.

18voto

Stephen C Points 255558

Certains ont suggéré d'utiliser INetAddress.isReachable. Le problème est que certains sites configurent leurs pare-feu pour bloquer les messages ICMP Ping. Ainsi, 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 hors service.

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

Le problème fondamental est que "peut se connecter à l'internet" est une question mal définie, et ce genre de chose est difficile à tester sans :

  1. des informations sur la machine de l'utilisateur et l'environnement réseau "local", et
  2. des informations sur ce à quoi l'application doit accéder.

En général, la solution la plus simple consiste donc pour une application à essayer d'accéder à tout ce à quoi elle doit accéder, et à faire appel à l'intelligence humaine pour effectuer le diagnostic.

0 votes

La question est simplement "existe-t-il un internet", rien de plus.

5 votes

C'est ce que je veux dire. La question "existe-t-il un internet" est mal définie. Lisez le texte ci-dessus pour des exemples qui visent à illustrer ce point.

1 votes

@Chris : "Internet" est mal défini. Être capable d'accéder à Google ne signifie pas nécessairement que vous pouvez accéder à n'importe quel autre endroit, par exemple. (Imaginez que le serveur DNS soit en panne, mais qu'il se trouve que vous ayez une entrée DNS dans votre fichier hosts).

8voto

Kutzi Points 679

Si vous êtes sur java 6, vous pouvez utiliser Interface réseau pour vérifier les interfaces réseau disponibles. C'est-à-dire quelque chose comme ça :

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

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

3 votes

Cela vérifie seulement que l'interface est activée. Il ne vérifie pas la connexion Internet.

0 votes

Néanmoins, le fait que l'interface réseau soit opérationnelle est une condition préalable à une connexion Internet. Je pense que cela a du sens comme première étape d'une solution plus robuste. Elle vous permet au moins de voir si vous avez une interface réseau active sans envoyer le moindre trafic réseau.

0 votes

Ce qui n'est pas ce que le PO a demandé.

8voto

MouseEvent Points 3303

Ce code :

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

Retourne - à moi - true si elle est hors ligne, et false sinon. (enfin, je ne sais pas si c'est vrai pour tous les ordinateurs).

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


EDIT : J'ai constaté que cela ne fonctionne que si le "flip switch" (sur un ordinateur portable), ou une autre option définie par le système, pour la connexion Internet, est désactivé. C'est-à-dire que le système lui-même sait qu'il ne doit pas chercher d'adresses IP.

0 votes

Ne fonctionne pas pour "127.0.0.1" mais montre une réponse à une autre adresse IP accessible.

0 votes

Cela fonctionne pour moi, je l'aime et je l'utilise. C'est une sorte de pré-vérification. Une vérification préliminaire pour s'assurer que l'interface réseau est connectée que vous pouvez invoquer avant de vérifier la connexion Internet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X