套接字中的发送和接收列表
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
假设我在服务器上有这段代码
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