当前位置: 首页 > 后端技术 > Python

Python网络编程:当内核读缓冲区为空时,调用socket的recv会发生什么?

时间:2023-03-26 15:06:18 Python

BlockingsocketBlockingsocket调用recv取不到数据:如果没有设置超时,会一直阻塞,直到有数据。如果设置了超时,如果在指定时间内没有收到数据,会抛出TimeoutError异常,Python自带的异常,不依赖第三方,不需要导入包,可以设置超时直接方法:importsocketclientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)clientsocket.connect(('127.0.0.1',8080))clientsocket.settimeout(3.0)data=clientsocket.recv(2024)clientsocket.close()data.decode()结果如下:Traceback(mostrecentcalllast):File"/home/bot/Desktop/coder/ideaboom/test_socket/main.py",line7,indata=clientsocket.recv(2024)TimeoutError:timedout参考文章:tcpbufferfullproblemHowtosettimeoutonpythonsocketrecvmethod?Non-blockingsocket非阻塞socket调用recvcannotgetdata:returnerrorimmediately:BlockingIOError:[Errno11]Resourcetemporarilyunavailable,其中BlockingIOError是Python内置异常,无需导入包,依赖第三方instances:importsocket#customer端发送一个数据,然后从socket接收一个数据importsocketasSocketclientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)clientsocket.connect(('127.0.0.1',8080))clientsocket.setblocking(False)data=clientsocket.recv(2024)clientsocket.close()结果如下:Traceback(mostrecentcalllast):File"/home/bot/Desktop/coder/ideaboom/test_socket/main.py",line10,indata=clientsocket.recv(2024)BlockingIOError:[Errno11]资源暂时不可用