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。在發送方的消息前面加上消息的長度前綴;然后接收者就會知道每條消息需要多少字節。
添加回答
舉報