web-dev-qa-db-fra.com

Testez si une connexion Internet est présente dans python

J'ai le code suivant qui vérifie si une connexion Internet est présente.

import urllib2

def internet_on():
    try:
        response=urllib2.urlopen('http://74.125.228.100',timeout=20)
        return True
    except urllib2.URLError as err: pass
    return False

Cela testera une connexion Internet, mais quelle est son efficacité?

Je sais qu'Internet varie en qualité d'une personne à l'autre, donc je cherche quelque chose qui est le plus efficace pour le large spectre, et le code ci-dessus semble qu'il pourrait y avoir des lacunes où les gens pourraient trouver des bugs. Par exemple, si quelqu'un vient d'avoir une connexion très lente et met plus de 20 secondes à répondre.

26
Joshua Strot

Mon approche serait quelque chose comme ceci:

import socket
REMOTE_SERVER = "www.google.com"
def is_connected(hostname):
  try:
    # see if we can resolve the Host name -- tells us if there is
    # a DNS listening
    Host = socket.gethostbyname(hostname)
    # connect to the Host -- tells us if the Host is actually
    # reachable
    s = socket.create_connection((Host, 80), 2)
    s.close()
    return True
  except:
     pass
  return False
%timeit is_connected(REMOTE_SERVER)
> 10 loops, best of 3: 42.2 ms per loop

Cela reviendra en moins d'une seconde s'il n'y a pas de connexion (OSX, Python 2.7).

Remarque: ce test peut renvoyer des faux positifs - par exemple la recherche DNS peut renvoyer un serveur au sein du réseau local. Pour être vraiment sûr que vous êtes connecté à Internet et que vous parlez à un hôte valide, assurez-vous d'utiliser des méthodes plus sophistiquées (par exemple SSL).

46
miraculixx

À partir de Python 2.6 et plus récent (y compris Python 3), une solution plus simple qui est également compatible avec IPv6 serait

import socket


def is_connected():
    try:
        # connect to the Host -- tells us if the Host is actually
        # reachable
        socket.create_connection(("www.google.com", 80))
        return True
    except OSError:
        pass
    return False

Il résout le nom et essaie de se connecter à chaque adresse de retour avant de conclure qu'il est hors ligne. Cela inclut également les adresses IPv6.

14
andrebrait

cela fonctionnera

import urllib
try :
    stri = "https://www.google.co.in"
    data = urllib.urlopen(stri)
    print "Connected"
except e:
    print "not connected" ,e 
2
ibrahim haleem khan

Je voulais tester ma connexion Internet dans une boucle infinie pour surveiller quand mon réseau monte et descend. J'ai remarqué ce qui suit: lorsque mon réseau était en panne et j'ai commencé le script de surveillance comme ça et le réseau est revenu, le script ne l'a pas remarqué. Le réseau était vivant mais le script ne l'a pas vu. Lorsque mon réseau était allumé et que j'ai commencé le script comme ça, il a remarqué les changements. J'ai donc trouvé la solution suivante qui a fonctionné pour moi dans les deux cas:

import shlex
from subprocess import call, PIPE, STDOUT

def get_return_code_of_simple_cmd(cmd, stderr=STDOUT):
    """Execute a simple external command and return its exit status."""
    args = shlex.split(cmd)
    return call(args, stdout=PIPE, stderr=stderr)

def is_network_alive():
    cmd = "ping -c 1 www.google.com"
    return get_return_code_of_simple_cmd(cmd) == 0

Ici, nous nous appuyons sur un programme externe (ping) indépendant de notre script.

1
Jabba

J'espère que je peux résoudre le problème avec vous.

import urllib
try :
    url = "https://www.google.com"
    urllib.urlopen(url)
    status = "Connected"
except :
    status = "Not connect"
print status
0
siczones

Http semble un niveau trop élevé pour vérifier la disponibilité du réseau.

Néanmoins, vous pouvez créer un thread qui vérifie périodiquement la connectivité et stocke l'état de connectivité, ensuite la méthode internet_on pourrait simplement vérifier l'état stocké. Cela devrait être plus rapide que de tester la connectivité à chaque fois.

0
mpromonet

Bien que la réponse ait été cochée, cela ne pouvait pas m'aider, j'avais une erreur comme

urllib2 n'est pas défini

donc j'avais essayé d'installer rllib2 bibliothèque en utilisant pip mais j'étais impuissant puis j'ai fouillé et heureusement j'ai eu une solution s'il vous plaît vérifier le code suivant, en partageant parce que quelqu'un qui rencontrera un problème que j'avais avant, obtiendra la solution

from urllib.request import urlopen

def is_internet_available():
    try:
        urlopen('http://216.58.192.142', timeout=1)
        return True
    except:
        return False


print(is_internet_available())
0
Viraj Mohite