假設我在服務器上有這段代碼
con.sendto(str(list).encode(), addr)
如何在客戶端檢索該串列(不是字串形式)?
uj5u.com熱心網友回復:
當您通過套接字發送內容時,您發送的是原始位元組,而不是字串,不是串列等。這就是為什么您需要將串列轉換為 astr然后將其編碼為bytes. 當您收到資料時,bytes您需要將該資料決議為一個串列,這取決于資料的型別可能相當復雜。
我建議的一件事是使用json序列化串列,而不是str因為json.dumps被設計為反序列化,其中str僅用于創建所給資料的人類可讀表示(為簡潔起見,我不會進行任何例外處理):
import json
l = ['a', 0, False]
data = json.dumps(l)
print(json.loads(data))
上面的代碼將列印:['a', 0, False].
從原始套接字接收資料時最大的問題是知道何時停止讀取。我經常使用的一種方法是預先發送資料的長度,這樣我們就可以避免任何驗證邏輯,直到我們收到一個完整的資料包。我們可以做到這一點struct
import struct
data_len = len(data)
payload = struct.pack('!i', data_len) data.encode()
現在我們只需要讀取資料!為簡潔起見,我假設緩沖區足夠大,可以在一次呼叫中存盤整個串列recv,對于大資料有效負載,您需要更加小心,但這超出了這個問題的范圍,所以我不會擔心關于這里:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/486419.html
