socket非阻塞recv大坑

Python中,socket用来实现网络通信,它默认的recv是一个阻塞的函数,也就是说,当运行到recv时,会在这个位置一直等待直到有数据传输过来,我在网上一篇文章看到:

Sunmmary
Python的socket.recv()方法可以通过传入flags=0x40参数配合try-except方法实现非阻塞。

于是便欣喜的放到了代码中,结果:


结果.png

然后又看到传入socket.MSG_DONTWAIT解决,结果:


结果.png

最后,终于找到一种可用的方法,使用setblocking设置.
s.setblocking(0)    #非阻塞模式
s.setblocking(1)    #阻塞模式

然后需要使用try/except语句捕捉BlockingIOError进行判断是否还有输入,这里分享一个小技巧,为了等待数据,我们可以用一个阻塞的recv等待,在这之后使用while循环进行非阻塞接收以接收不定长的数据.
接收函数代码:

def recv(s):
    buffer=[s.recv(1024)]    #一开始的部分,用于等待传输开始,避免接收不到的情况.
    if buffer[0] in (0,-1):    #返回0,-1代表出错
        return False
    s.setblocking(0)    #非阻塞模式
    while True:    #循环接收
        try:
            data=s.recv(1024)    #接收1024字节
            buffer.append(data)    #拼接到结果中
        except BlockingIOError as e:    #如果没有数据了
            break    #退出循环
    s.setblocking(1)    #恢复阻塞模式
    return b"".join(buffer).decode("utf-8")    #编码并返回



以上是这篇文章的全部,错误的地方恳请指正.
QQ:8955859,希望能和大家一起学习.
最后,都看到这了,赞赏一下呗!(^ ~ ^||).

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容