如果之前已经解决过这个问题,请原谅我,但是如何在 python 应用程序(套接字)中组织客户端和服务器之间交换的数据?
假设我有一些必须发送的元素 - 字符串、元组、字典:
"hello world", (1, 2, 3), {"k": "v"}
我目前所做的只是将所有内容都转换为字符串 -repr()
在发送之前和eval()
接收之后调用。这显然显得有些多余。
我应该如何发送这些数据块?有约定吗?首选格式?我该如何压缩它?
如果之前已经解决过这个问题,请原谅我,但是如何在 python 应用程序(套接字)中组织客户端和服务器之间交换的数据?
假设我有一些必须发送的元素 - 字符串、元组、字典:
"hello world", (1, 2, 3), {"k": "v"}
我目前所做的只是将所有内容都转换为字符串 -repr()
在发送之前和eval()
接收之后调用。这显然显得有些多余。
我应该如何发送这些数据块?有约定吗?首选格式?我该如何压缩它?
JSON 是您正在寻找的。如果您有一个对象并导入 JSON 函数:
from json import dumps, loads
您可以使用它dumps(obj)
来编码为 JSONloads(str)
并将 JSON 字符串转换回对象。例如:
dumps([[1,2,3],{"a":"b", "c":"d"}])
产量'[[1, 2, 3], {"a": "b", "c": "d"}]'
和
loads('[[1, 2, 3], {"a": "b", "c": "d"}]')
产量[[1, 2, 3], {u'a': u'b', u'c': u'd'}]
。
最简单的方法是在客户端腌制它们并在服务器端取消腌制它们。但是,需要确保数据来自受信任的来源,因为可以强制 unpickle 执行任意代码。确保你使用cPickle
了 C 语言实现。
您永远不 eval()
应该从不受信任的来源获得数据,这意味着您永远不应该eval()
通过不安全的网络连接到达任何东西(或者您不能绝对确定另一端的实体是谁或它所说的内容)。
显而易见的解决方案是在一端将数据编码为 JSON,并在另一端对其进行解码(除非您有特定的性能要求,需要高度压缩的格式,例如msgpack)。