Python:检查internet连接(不止一次)

Python:检查internet连接(不止一次),python,networking,Python,Networking,我已经在一个python程序中实现了一个快速解决方案来检查internet连接,使用了我在SO上找到的内容: def check_internet(self): try: response=urllib2.urlopen('http://www.google.com',timeout=2) print "you are connected" return True except urllib2.URLError as err:

我已经在一个python程序中实现了一个快速解决方案来检查internet连接,使用了我在SO上找到的内容:

def check_internet(self):
    try:
        response=urllib2.urlopen('http://www.google.com',timeout=2)
        print "you are connected"
        return True
    except urllib2.URLError as err:
        print err
        print "you are disconnected"
有一次效果很好,如果我尝试一次,就表明我没有联系。但是如果我重新建立连接并重试,它仍然会说我没有连接


urllib2连接是否未以某种方式关闭?我应该做些什么来重置它吗

这是我用来检查我的一个应用程序的连接的方式

import httplib
import socket
test_con_url = "www.google.com" # For connection testing
test_con_resouce = "/intl/en/policies/privacy/" # may change in future
test_con = httplib.HTTPConnection(test_con_url) # create a connection

try:
    test_con.request("GET", test_con_resouce) # do a GET request
    response = test_con.getresponse()
except httplib.ResponseNotReady as e:
    print "Improper connection state"
except socket.gaierror as e:
    print "Not connected"
else:
    print "Connected"

test_con.close()

我反复测试了启用/禁用LAN连接的代码,它正常工作。

这可能是因为服务器端缓存

试试这个:

def check_internet(self):
    try:
        header = {"pragma" : "no-cache"} # Tells the server to send fresh copy
        req = urllib2.Request("http://www.google.com", headers=header)
        response=urllib2.urlopen(req,timeout=2)
        print "you are connected"
        return True
    except urllib2.URLError as err:
        print err
我还没有测试过。但根据“pragma”的定义,它应该有效


如果您想了解pragma,这里有一个很好的讨论:

只发出HEAD请求会更快,因此不会提取HTML。
而且我相信谷歌会更喜欢这种方式:)

#取消python2的注释
#导入httplib
将http.client作为httplib导入
def已连接到internet():
conn=httplib.HTTPConnection(“www.google.com”)
尝试:
控制请求(“头”、“头”)
返回真值
除:
返回错误

这行不通。检查你的代码缩进…是的,我的代码没有缩进,很抱歉。在我的实际代码中,它是正确缩进的。它只能工作一次,并且无法识别何时重新建立连接。您看到了什么错误?@ekianjo您看到的
print err
的错误可能(!)对于回答您的问题至关重要。所以告诉我们这件事可能真的很有帮助。好吧,我会让你知道的。给我几个小时(现在不行)。谢谢,我会试试这个!我会回来确认它是否工作。如果无法建立第一个连接,应该缓存哪个服务器端?GLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGLGL?在某个地方似乎确实存在缓存问题。@ekianjo我也考虑过这个问题-可能是DNS缓存问题-但通常操作系统应该知道这一点。这就是为什么对你的问题的最新评论的回答可能非常有用…@ekianjo:实际上是DNS问题:看看如果没有互联网连接,你如何获得状态?在这种情况下,建立连接首先应该失败…@Babu,我还没有测试你的解决方案,让我尽快回来。@Babu,我尝试了你的解决方案,它在桌面上工作,但在Linux手持设备上使用的Python版本上也不工作…:(可能这与使用urllib2的问题相同:Python版本中的一个bug。我在我的Ubuntu机器12.04上用Python版本2.7测试了它。