Socket通信发送列表时客户端如何接收还原非字符串形式原始列表
客户端接收还原原始列表的实现方案
服务端发送逻辑是将Python列表直接转为字面量字符串后编码为字节流传输,客户端按以下步骤处理即可得到原生列表对象,严禁直接使用eval()做转换,存在任意代码执行的高危安全风险。
- 字节流解码:接收到的原始数据是
bytes类型,调用和服务端编码规则匹配的decode()方法即可得到列表对应的字符串形式,服务端未指定编码时默认使用UTF-8。 - 安全解析为原生列表:使用Python标准库
ast模块的literal_eval()方法做字面量转换,该方法仅会解析Python原生基础数据结构(列表、字典、元组、字符串、数字、布尔值、None等),不会执行字符串中夹带的恶意代码。
参考实现代码
因为服务端使用sendto()方法发送,属于UDP套接字场景,客户端参考代码如下:
import ast import socket # 此处省略客户端套接字初始化、端口绑定等前置逻辑 data, server_addr = con.recvfrom(2048) # 第一步:字节流转字符串 list_content_str = data.decode() # 第二步:安全解析得到原生列表对象 original_list = ast.literal_eval(list_content_str) # 验证类型:输出为<class 'list'>,即非字符串形式的原始列表 print(type(original_list))
注意事项:如果列表内包含自定义类实例对象,服务端的
str(list)转换本身就会丢失对象的结构化信息,仅会保留类似<__main__.CustomObj object at 0x100abc123>的字符串描述,无法通过该方案还原完整对象。如果有传输复杂结构化对象的需求,建议改用JSON、pickle(仅可信环境使用)等标准化序列化方案。
内容的提问来源于stack exchange,提问作者Connor Club
相关产品推荐
相关产品推荐

