[英]Sending and receiving lists in socket
假設我在服務器上有這段代碼
con.sendto(str(list).encode(), addr)
我如何在客戶端檢索該列表(不是字符串形式)?
當您通過套接字發送內容時,您發送的是原始字節,而不是字符串,而不是列表等。這就是為什么您需要將列表轉換為str
然后將其編碼為bytes
的原因。 當您收到數據時,它以bytes
形式出現,因此您需要將該數據解析為一個列表,這取決於數據類型可能相當復雜。
我建議的一件事是使用json
來序列化列表而不是str
,因為json.dumps
被設計為反序列化,其中str
僅用於創建給定數據的人類可讀表示(我不會做任何例外為簡潔起見處理):
import json
l = ['a', 0, False]
data = json.dumps(l)
print(json.loads(data))
上面的代碼將打印: ['a', 0, False]
。
從原始 sockets 接收數據時最大的問題是知道何時停止讀取。 我經常使用的一種方法是在發送數據的長度之前加上,這樣我們就可以避免任何驗證邏輯,直到我們收到一個完整的數據包。 我們可以用struct
來做到這一點
import struct
data_len = len(data)
payload = struct.pack('!i', data_len) + data.encode()
現在我們只需要讀取數據! 為了簡潔起見,我假設緩沖區足夠大,可以在對recv
的一次調用中存儲整個列表,對於大數據有效負載,您需要更加小心,但這超出了這個問題的 scope 所以我不會在這里擔心:
def receive_list(conn):
# determine how many bytes are in the prefix
prefix_len = struct.calcsize("!i")
buffer = conn.recv(4096)
# we really should be more careful about indexes here ;)
data_len = struct.unpack("!i", buffer[:prefix_len])[0]
data = buffer[prefix_len: data_len + prefix_len]
l = json.loads(data)
return l
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.