web-dev-qa-db-ja.com

pythonでインターネット接続が存在するかどうかをテストします

インターネット接続が存在するかどうかを確認する次のコードがあります。

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

これはインターネット接続をテストしますが、どれほど効果的ですか?

インターネットは人によって質が異なることを知っているので、広範囲に最も効果的なものを探しています。上記のコードは、人々がバグを見つけることができる抜け穴があるようです。たとえば、接続が非常に遅く、応答に20秒以上かかった場合。

26
Joshua Strot

私のアプローチは次のようなものになります。

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

接続がない場合、これは1秒以内に戻ります(OSX、Python 2.7)。

注:このテストでは、誤検知が返される可能性があります。 DNSルックアップは、ローカルネットワーク内のサーバーを返す場合があります。インターネットに確実に接続し、有効なホストと通信していることを確認するには、より洗練された方法(SSLなど)を使用してください。

46
miraculixx

Python 2.6以降(Python 3を含む)以降、IPv6と互換性のあるより簡単なソリューションは

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

名前を解決し、それがオフラインであると結論付ける前に、各リターンアドレスへの接続を試みます。これにはIPv6アドレスも含まれます。

14
andrebrait

これは動作します

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

ネットワークがいつ上下するかを監視するために、無限ループでインターネット接続をテストしたかったのです。私は次のことに気付きました。ネットワークがダウンし、そのような監視スクリプトを開始し、ネットワークが戻ったとき、スクリプトはそれに気づきませんでした。ネットワークは生きていましたが、スクリプトはそれを見ませんでした。ネットワークがオンになっていて、そのようなスクリプトを開始すると、変更に気付きました。だから、私は両方の場合に私のために働いた次のソリューションを思いついた:

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

ここでは、スクリプトから独立した外部プログラム(ping)に依存しています。

1
Jabba

私はあなたとの問題を助けることができることを望みます。

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

Httpは、ネットワークの可用性を確認するには高すぎるようです。

それでも、定期的に接続を確認して接続状態を保存するスレッドを作成できます。次に、internet_onメソッドは保存された状態を確認するだけです。これは、毎回接続をテストするよりも速くなるはずです。

0
mpromonet

答えはチェックされていますが、私を助けることはできませんでした、私は次のようなエラーが発生しました

urllib2は未定義です

だから私はrllib2 libraryをpipを使用してインストールしようとしましたが、無力でしたので、私は周りを掘り下げて解決策を得ました。ソリューション

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