python socket recv非阻塞_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,希望能和大家一起学习.

最后,都看到这了,赞赏一下呗!(^ ~ ^||).

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值