python检测网络是否有网

Python019

python检测网络是否有网,第1张

import os

exit_code = os.system('ping www.baidu.com>con')

if exit_code:

    raise Exception('connect failed.')

    print("网络异常")

else:

    print("网络正常")

用urllib.urlopen读取, 然后看下是否有“<title>百度一下”之类的关键词比较靠谱, 比如

In [1]: import urllib

In [2]: is_online = u'<title>百度一下,你就知道' in urllib.urlopen("http://www.baidu.com/").read().decode('gbk')

In [3]: print is_online

True

如果你用的socket包里的那些阻塞接口,当然写个线程循环监测时间也没啥,只不过记得在循环内加上个sleep,哪怕是1ms甚至1us的sleep都可以避免CPU被消耗干净。

如果你所说的接收是死循环式里跑socket.recv,它会在recv里阻塞,按你的说法3分钟一个心跳包,时间检测就成了3分钟一次,不太合适。

更好的办法自然是通过epoll/poll之类的方式或者asyncio/twisted/tornado之类的异步回调/协程加时间事件甚至是各种GUI框架的事件循环来启动你的发送和接收。考虑到以后可能有多设备,显然利用这些成型的玩意更合理。