一、问题再现:socket接受数据被阻塞
正常的TCP服务器端代码如下
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) #设置端口复用,必须程序2min内无法长期
s.bind(('', 12345))
s.listen(5)
print("waiting for connection!!!")
while True:
sock, addr = s.accept()
print("receive connection from %s:%s" % addr)
data = sock.recv(1024)
当Client没有发送数据时,Server会阻塞地等待接收数据,也就是程序会停在data = sock.recv(1024)
这一行代码
现在有一个业务需求,需要无阻塞的接受数据:有数据,则接受;无数据,则跳过这一行
二、无阻塞接受数据
经过资料查询,其实只需要增加一个参数
data = sock.recv(1024, 0x40)
目前官方关于这个参数的解释不多,目前仅仅是拿过来使用
如果直接使用的话,会报一个错误
[Errno 11] Resource temporarily unavailable
产生这个错误的原因是:你希望可以立即接受信息,但是实际上此时并没有信息传送过来,超时报错
对非阻塞socket而言,这个不是一种错误,也不会破坏socket的同步,不用管它
可以搭配try...except
使用
try:
data = sock.recv(4096, 0x40)
except BlockingIOError as e:
data = None
参考资料:
[Python]关于socket.recv()的非阻塞用法
socket Resource temporarily unavailable,errno代码为11(EAGAIN)
Python error: “socket.error: [Errno 11] Resource temporarily unavailable” when sending image