You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:01:25