Python socket网络编程之阻塞与非阻塞模式

看到此文,是否觉得体内洪荒之力爆发,饥渴难耐想吐槽、情不自禁想捐赠
本文为原创文章,尊重辛勤劳动,可以免费摘要、推荐或聚合,亦可完整转载,但完整转载需要标明原出处,违者必究。

支付宝微  信

智能家居项目hestia中,遇到一个关于python socket编程的小问题。发现在python socket客户端一端,在服务端断开时,没有抛出异常。

    try:
        msg = _sFile.readline()
    except socket.error, e:
        logging.info("socket exception" + e.message)
        _reconnect()

翻阅文档后,发现python socket分为阻塞式和非阻塞式。默认初始化的socket是阻塞式的,在阻塞式下,如果socket断开链接,将会返回空串。官方解释如下

socket.setblocking(flag)
Set blocking or non-blocking mode of the socket: if flag is 0, the socket is set to non-blocking, else to blocking mode. Initially all sockets are in blocking mode. In non-blocking mode, if a recv() call doesn’t find any data, or if a send() call can’t immediately dispose of the data, an error exception is raised; in blocking mode, the calls block until they can proceed. s.setblocking(0) is equivalent to s.settimeout(0.0)s.setblocking(1) is equivalent to s.settimeout(None).

故修改代码如下:

    try:
        msg = _sFile.readline()
        if msg == "": 
            _reconnect()
    except socket.error, e:
        logging.info("socket exception" + e.message)
        _reconnect()

文章来源:胡小旭 => Python socket网络编程之阻塞与非阻塞模式


这是一篇原创文章,如果您觉得有价值,可以通过捐赠来支持我的创作~
捐赠者会展示在博客的某个页面,钱将会用在有价值的地方,思考中...


分类: Python, 技术, 编程, 随记 | 标签: , , , , | 评论 | Permalink

发表评论

电子邮件地址不会被公开。