1 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
sock.recv()返回可用的數(shù)據(jù)。手冊(cè)頁中的相關(guān)部分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)似乎允許消息的所有剩余數(shù)據(jù)到達(dá)并存儲(chǔ)在緩沖區(qū)中。
有一些選項(xiàng)可以消除time.sleep(0.005). 哪一種最合適取決于您的需求。
sock.close()如果發(fā)送方發(fā)送數(shù)據(jù),但不期望得到響應(yīng),您可以讓發(fā)送方在發(fā)送數(shù)據(jù)后(即after )關(guān)閉套接字sock.sendall()。recv()將返回一個(gè)空字符串,可用于打破while接收器上的循環(huán)。
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)
如果發(fā)送方發(fā)送固定長(zhǎng)度(例如172800字節(jié))的消息,則可以recv()循環(huán)使用,直到接收方收到完整的消息。
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)
其他選項(xiàng)包括:在發(fā)送方發(fā)送的消息末尾添加分隔符,例如不能成為數(shù)據(jù)一部分的特殊字符;然后接收器可以recv()循環(huán)運(yùn)行,直到檢測(cè)到分隔符和 b。在發(fā)送方的消息前面加上消息的長(zhǎng)度前綴;然后接收者就會(huì)知道每條消息需要多少字節(jié)。
添加回答
舉報(bào)