V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
suckli
V2EX  ›  Python

python如何发送一个数据结构

  •  
  •   suckli · 2012-08-05 23:44:55 +08:00 · 5688 次点击
    这是一个创建于 4522 天前的主题,其中的信息可能已经有所发展或是发生改变。
    小弟最近在学习python网络编程,请问各位大侠是如何发送一个数据结构的?

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

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

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

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

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

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

    help(marshal)

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

    from ctypes import bytearray

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

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

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

    http://redis.io/
    dreampuf
        14
    dreampuf  
       2012-08-08 15:13:26 +08:00
    关于Pickle,我觉得你需要知道更多。顺便广告一枚介绍一些pickle的经验 http://weibo.com/1739612153/ywd7xBsUN
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   905 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:34 · PVG 06:34 · LAX 14:34 · JFK 17:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.