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