【发布时间】:2014-07-13 19:43:20
【问题描述】:
我正在为一个学校项目(不适用于现实世界)运行一个非常简单的 python (3.x) 客户端-服务器程序(都在我的 PC 上本地),它只是来回发送消息(如视图客户,添加客户,删除客户等......真正的基本)。
有时数据可以是我存储为 namedTuples 的多条记录(这很有意义),然后沿着使用 Pickle 传输的路径走下去。
例如,在客户端上我会这样做:
s.send(message.encode('utf-8'))
pickledResponse = s.recv(4096);
response = pickle.loads(pickledResponse)
现在我经常收到以下错误:
response = pickle.loads(pickledResponse)
EOFError: Ran out of input
我担心这与我的套接字 (TCP) 传输有关,也许不知何故我没有及时为我的 pickle.loads 获取所有数据 - 有意义吗?如果不是这样,我真的不知道为什么会如此不一致地发生。
但是,即使我是对的,我也不确定如何(快速)修复它,我正在考虑放弃泡菜并只使用字符串(但这不会遭受同样的命运吗)?有人有什么建议吗?
真的,我的信息非常基本 - 通常只是一个命令和一些小数据,如“1=John”,这意味着命令 (1),它是 FIND 命令,然后是“John”,它返回记录(姓名、年龄等...) 的 John(作为 namedTuple - 但老实说这不是强制性的)。
任何建议或帮助将不胜感激,正在寻找快速解决方案...
【问题讨论】:
-
如果来源不受信任,则不应使用 pickle,并且在网络上,请不要信任任何人,引用文档:“警告 pickle 模块并非旨在防止错误或恶意构造的数据。永远不要解开从不受信任或未经身份验证的来源收到的数据。"
-
您可能会考虑自己不使用套接字的可能性(自己使用套接字意味着要注意消息长度,您在这里没有做什么)。我将提倡使用 HTTP、JSON 消息,并且我们在这里,所有这些 RESTful。
-
@JulienPalard 鉴于这是一个学校项目,“受信任”的想法并不重要,项目要求是使用套接字 (TCP) 进行通信 - 遗憾的是我无法改变这一点
-
@JulienPalard 知道它都是本地的(在同一台 PC 上),没有办法解决处理长度的问题吗?如果我使用 STRINGS 而不是 Pickled 数据会怎样?有没有其他方法可以避免这个问题?
-
您可以使用 pickle 版本 1(人类可读)或 json 轻松调试,您会看到哪里出了问题。关闭连接是可以的,不必关心长度。