阻塞 socket
阻塞 socket 调用 recv 获取不到数据:
- 如果没有设置超时时间,这永远阻塞直到有数据
- 如果设置了超时时间,在规定时间内没有收到数据,这抛出 TimeoutError 异常,该异常为 Python 自带异常,不依赖第三方,也不只需要导包,直接用就可以
设置超时方式:
import socket
clientsocket = 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 (most recent call last):
File "/home/bot/Desktop/coder/ideaboom/test_socket/main.py", line 7, in <module>
data = clientsocket.recv(2024)
TimeoutError: timed out
参考文章:
tcp 缓冲区满的问题
如何在 python 的 socket recv 方法上设置超时?
非阻塞 socket
非阻塞 socket 调用 recv 获取不到数据:
- 立即返回错误:BlockingIOError: [Errno 11] Resource temporarily unavailable,其中的 BlockingIOError 为 Python 内建异常,不需要导包和依赖第三方
实例:
import socket # 客户端 发送一个数据,再接收一个数据
from socket import socket as Socket
clientsocket = 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 (most recent call last):
File "/home/bot/Desktop/coder/ideaboom/test_socket/main.py", line 10, in <module>
data = clientsocket.recv(2024)
BlockingIOError: [Errno 11] Resource temporarily unavailable
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。