[英]Socket. How to receive all data with socket.recv()?
我在從服務器到客戶端接收數據時遇到問題。 我有以下客戶端函數嘗試從服務器接收數據。 服務器使用socket.sendall (data)
函數發送的socket.sendall (data)
大於buff_size
因此我需要一個循環來讀取所有數據。
def receiveAll (sock):
data = ""
buff_size = 4096
while True:
part = sock.recv (buff_size)
data + = part
if part <buff_size:
break;
return data
我遇到的問題是,在第一次迭代后(讀取第一個4096mb),在第二次迭代中程序被阻塞,等待part = sock.recv (buff_size)
的其他數據。 我如何才能使recv()
繼續讀取其他丟失的數據? 謝謝。
你的解釋是錯誤的。 您的代碼讀取從服務器獲取的所有數據。 它只是不知道它應該停止偵聽傳入的數據。 它不知道服務器發送了它所擁有的一切。
首先要注意這些線條
if part <buff_size:
break;
是非常錯的。 首先,您要將字符串與int進行比較(在Python3.x中會引發異常)。 但即使你的意思是if len(part) <buff_size:
那么這仍然是錯誤的。 因為首先在流媒體中間可能存在滯后,你只能閱讀比buff_size
更小的buff_size
。 你的代碼將停在那里。
此外,如果您的服務器發送大小為buff_size
的倍數的buff_size
則if
部分將永遠不會被滿足,並且它將永遠掛在.recv()
上。
旁注:不要使用分號;
。 這是Python。
有幾種解決方案,您的問題,但沒有人能夠正確不modyfing在服務器端使用。
作為客戶,您必須知道何時停止閱讀。 但了解它的唯一方法是,如果服務器做了一些特殊的事情,你會理解它。 這稱為通信協議。 您必須為發送/接收的數據添加含義。
例如,如果您使用HTTP,那么服務器會在正文之前發送此標題Content-Length: 12345
,所以現在作為客戶端您知道您只需要讀取12345
個字節(您的緩沖區不必那么大,但是信息你會知道在閱讀之前你必須循環多少次)。
例如,一些二進制協議可以以前2或4字節發送內容的大小。 這也可以在客戶端輕松解釋。
更簡單的解決方案是:只需讓服務器在發送所有數據后關閉連接。 然后你只需要添加檢查, if not part: break
代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.