1 回答
TA贡献1876条经验 获得超7个赞
sock.recv()返回可用的数据。手册页中的相关部分recv(2)是:
The receive calls normally return any data available, up to the requested amount,
rather than waiting for receipt of the full amount requested.
在您的情况下,time.sleep(0.005)似乎允许消息的所有剩余数据到达并存储在缓冲区中。
有一些选项可以消除time.sleep(0.005). 哪一种最合适取决于您的需求。
sock.close()如果发送方发送数据,但不期望得到响应,您可以让发送方在发送数据后(即after )关闭套接字sock.sendall()。recv()将返回一个空字符串,可用于打破while接收器上的循环。
def recvall(sock):
BUFF_SIZE = 4096
fragments = []
while True:
chunk = sock.recv(BUFF_SIZE)
if not chunk:
break
fragments.append(chunk)
return b''.join(fragments)
如果发送方发送固定长度(例如172800字节)的消息,则可以recv()循环使用,直到接收方收到完整的消息。
def recvall(sock, length=172800):
fragments = []
while length:
chunk = sock.recv(length)
if not chunk:
raise EOFError('socket closed')
length -= len(chunk)
fragments.append(chunk)
return b''.join(fragments)
其他选项包括:在发送方发送的消息末尾添加分隔符,例如不能成为数据一部分的特殊字符;然后接收器可以recv()循环运行,直到检测到分隔符和 b。在发送方的消息前面加上消息的长度前缀;然后接收者就会知道每条消息需要多少字节。
添加回答
举报