簡體   English   中英

插座。 如何使用socket.recv()接收所有數據?

[英]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_sizeif部分將永遠不會被滿足,並且它將永遠掛在.recv()上。

旁注:不要使用分號; 這是Python。


有幾種解決方案,您的問題,但沒有人能夠正確不modyfing在服務器端使用。

作為客戶,您必須知道何時停止閱讀。 但了解它的唯一方法是,如果服務器做了一些特殊的事情,你會理解它。 這稱為通信協議。 您必須為發送/接收的數據添加含義。

例如,如果您使用HTTP,那么服務器會在正文之前發送此標題Content-Length: 12345 ,所以現在作為客戶端您知道您只需要讀取12345個字節(您的緩沖區不必那么大,但是信息你會知道在閱讀之前你必須循環多少次)。

例如,一些二進制協議可以以前2或4字節發送內容的大小。 這也可以在客戶端輕松解釋。

更簡單的解決方案是:只需讓服務器在發送所有數據后關閉連接。 然后你只需要添加檢查, if not part: break代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM