簡體   English   中英

套接字中的發送和接收列表

[英]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.

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