【发布时间】:2018-11-01 19:09:38
【问题描述】:
我希望我的 Python 脚本检查它是否在线。在 Stack Overflow 上找到了很多答案,但由于一些奇怪的原因都失败了。
场景:Raspberry Pi 3b+ 通过 Wifi 连接到我的路由器。那个路由器通过它的电缆连接到互联网
我希望确定 Raspberry 是否有互联网连接,以便在需要时更改其数据源。在这里搜索了一天后,我发现大多数解决方案都使用套接字,更好的是套接字,而最坏的是套接字(仍然试图看看它是否改变了任何东西,但没有)urllib.urlopen。
这是我的尝试:
def checkOnlineState(self, addr='http://www.google.com'):
try:
urllib2.urlopen(addr, timeout=2)
if not self._onlineMode:
print('Internet connection is back!')
self._onlineMode = True
return
except:
pass
if self._onlineMode:
print('I lost internet connection')
self._onlineMode = False
我也尝试过使用套接字,所以我使用了 urllib2.urlopen 而不是
socket.create_connection((addr, 80), timeout=2)
或
socket.create_connection(('8.8.8.8', 0), timeout=2)
无论我做什么,除了输入格式错误的 ip 或 url 外,都说我在线。我怎么知道?嗯,checkOnlineState 是循环运行的,如果我把网线拔掉,树莓派还是会说它在线!
【问题讨论】:
-
您从未真正连接到到互联网;您只能通过 Internet 连接到计算机,因此,您唯一能做的就是检查您是否可以事实上连接到给定的远程主机。但是,不要捕获并忽略每个引发的异常;至少将异常记录到标准错误中,这样您就可以查看在尝试建立连接时实际发生了什么(如果有的话)。
-
好吧,如果我没有连接,如何连接到 8.8.8.8,谷歌,不会引发异常。我确实尝试通过示例来捕捉 OSError,当然它是相同的
标签: python python-2.7 raspberry-pi