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,希望能和大家一起学习.
最后,都看到这了,赞赏一下呗!(^ ~ ^||).

你可能感兴趣的:(socket非阻塞recv大坑)