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

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

从原始套接字接收数据时最大的问题是知道何时停止读取。我经常使用的一种方法是在发送数据的长度之前加上,这样我们就可以避免任何验证逻辑,直到我们收到一个完整的数据包。我们可以用 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