python如何发送一个数据结构

2012-08-05 23:44:55 +08:00
 suckli
小弟最近在学习python网络编程,请问各位大侠是如何发送一个数据结构的?

比如说我定义了一个协议,客户端和服务器按照定义的该协议进行通信

这个协议的表现形式可以是一个结构体或者是一个类

问题是,我如何把这一个结构体或者类的对象给发送出去~?

也就是说如何发送一个非字符串类型的数据?

先谢过
5667 次点击
所在节点    Python
14 条回复
xowenx
2012-08-06 00:01:13 +08:00
protobuffer,thrift
推荐更轻量的protobuffer
keakon
2012-08-06 00:02:42 +08:00
不管你是什么协议,发送的都是字符串,区别是文本或二进制…

如果双方都用Python,可以用pickle;否则可以用struct,自己做解析;和JavaScript打交道的话可以用JSON。
Livid
2012-08-06 06:10:05 +08:00
import marshal

help(marshal)

marshal.loads()
marshal.dumps()
freefcw
2012-08-06 09:41:42 +08:00
如果想发送二进制的数据的话,可以使用bytearray,不过编码和解码算法需要自己定义,好处是通用性比较好,各种语言通用

from ctypes import bytearray

ACK = bytearray(3)
ACK[0]=0x80;
ACK[1]=0x02;
ACK[2]=0xfe;
zxp
2012-08-06 09:59:23 +08:00
还有phprpc可以用
richardma
2012-08-06 12:36:53 +08:00
感觉就是序列化,然后在eval的过程,说到底就是这个意思,实现上应该有很多库吧。
kavinyao
2012-08-06 12:55:31 +08:00
@Livid 一直想请教这个问题:官方文档中说marshal是内部模块,并且不推荐作序列化使用。但是之前看一些slides,感觉很多人都marshal来序列化。

请问这是通用做法吗?相对于pickle和shelve有何好处?
ayanamist
2012-08-06 13:13:00 +08:00
@keakon @Livid @richardma pickle是有安全风险的,会引起不安全的代码执行的。
fanzeyi
2012-08-06 13:14:10 +08:00
@kavinyao 我记得有说 marshal 在不同的 Python 版本中的表现不同.. 所以不能跨 Python 版本通过它交换数据
notedit
2012-08-06 13:20:00 +08:00
@kavinyao pickle 本身是一门语言,在解码的时候可以构造一些代码让其执行,不安全。marshal 是python 专有的,其他的语言没法解析,如果你只在python服务之间传递的话,可以使用。

我自己使用比较多的是bson和msgpack,推荐msgpack,打包的数据更小,多语言支持。
cloudzhou
2012-08-06 14:00:31 +08:00
@notedit marshal 在不同版本之间的python可能不能兼容的,这是不推荐的其中一个原因
leafduo
2012-08-07 01:12:45 +08:00
JSON 呗,流量敏感的话就 protobuf
Livid
2012-08-07 01:27:21 +08:00
或者也可以考虑使用一个 data structure server:

http://redis.io/
dreampuf
2012-08-08 15:13:26 +08:00
关于Pickle,我觉得你需要知道更多。顺便广告一枚介绍一些pickle的经验 http://weibo.com/1739612153/ywd7xBsUN

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/44347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX