【问题标题】:How do you transfer binary data with Python?如何使用 Python 传输二进制数据?
【发布时间】:2009-04-22 02:11:12
【问题描述】:

我是第一次从事客户端-服务器程序,我感到非常遗憾,我不知道从哪里开始我正在做的事情。

我将使用Google Protocol Buffers 在我的客户端和我的服务器之间传输二进制数据。我将使用 Python 变体。据我了解,基本思想是客户端将数据序列化,将其发送到服务器,然后服务器将反序列化数据。

问题是,我真的不知道从哪里开始向服务器发送二进制数据。我希望它是像 HTTP 请求这样“简单”的东西,但我一直在 Google 周围寻找传输二进制数据的方法,并在大量的教程、指南和文档中迷失了方向。我什至无法通过调查 HTTP 传输来判断我是否在寻找错误的树(我希望使用它,所以如果需要安全性,我可以将它提升到 HTTPS 的一个档次)。不过,我真的不想达到套接字编程的水平——我想在转向之前使用可用的库。 (我也更喜欢标准 Python 库,但如果有完美的 3rd 方库,我会支持。)

所以,如果有人对如何通过 Python 传输二进制数据有一个很好的起点(或想自己解释一下),我将不胜感激。顺便说一下,我正在运行的服务器目前正在运行带有 mod_python 的 Apache。

【问题讨论】:

  • 我不确定您所说的“二进制数据”是什么意思。序列化数据意味着使其成为二进制,反序列化意味着将其解压缩成更有用的格式。您能否详细说明您在序列化时遇到问题的特定数据?

标签: python http file client-server protocol-buffers


【解决方案1】:

任何时候您要将二进制数据从一个系统移动到另一个系统时,都需要牢记几件事。

不同的机器以不同的方式存储相同的信息。这对内存和网络都有影响。更多信息在这里 (http://en.wikipedia.org/wiki/Endianness)

因为您使用的是 python,所以您可以在这里放松一下(假设客户端和服务器都在 python 中),只需使用 cPickle 来序列化您的数据。如果你真的想要二进制文件,你将不得不熟悉 python 的 struct 模块 (http://docs.python.org/library/struct.html)。并了解如何打包/解包您的数据。

我会首先从简单的线路协议服务器开始,直到您克服网络通信的困难。如果您以前从未这样做过,它会很快变得混乱。如何发出命令,如何传递数据,如何重新同步错误等等......

如果您已经了解客户端/服务器协议设计的基础知识,请先练习在磁盘上打包和解包二进制结构。对于这种情况,我还会参考 HTTP 和 FTP 的 RFC。

--------根据评论编辑-------- 通常这种事情是通过向服务器发送一个包含文件校验和以及文件大小(以字节为单位)的“标题”来完成的。请注意,我不是指 HTTP 标头,您可以根据需要自定义它。事件链需要像这样......

CLIENT: "UPLOAD acbd18db4cc2f85cedef654fccc4a4d8 253521"
SERVER: "OK"
(server splits the text line to get the command, checksum, and size)
CLIENT: "010101101010101100010101010etc..." (up to 253521 bytes)
(server reasembles all received data into a file, then checksums it to make sure it matches the original)
SERVER: "YEP GOT IT"
CLIENT: "COOL CYA"

这是过于简化了,但我希望你能明白我在说什么。

【讨论】:

  • 我已经得到了数据(比如说在一个文件中)——问题真的是,我如何传输文件? (我想我说的二进制数据听起来比我应该说的更复杂,但我的意思是文件传输。)
【解决方案2】:

我不确定你的问题是否正确,但也许你可以看看twisted project

正如您在常见问题解答中看到的那样,“Twisted 是一个用 Python 编写的网络引擎,支持多种协议。它包含一个 Web 服务器、多个聊天客户端、聊天服务器、邮件服务器等。Twisted 由一个可以单独访问的子项目的数量[...]”。

文档很不错,网上也有很多例子。希望对您有所帮助。

【讨论】:

    【解决方案3】:

    我想这取决于您与 Google 协议缓冲区的联系程度,但您可能想查看Thrift

    Thrift 是一个软件框架 可扩展的跨语言服务 发展。它结合了一个软件 堆栈与代码生成引擎 构建高效工作的服务 并在 C++、Java、 Python、PHP、Ruby、Erlang、Perl、 Haskell、C#、Cocoa、Smalltalk 和 OCaml。

    在他们的主页上有一个很好的入门示例。

    【讨论】:

      【解决方案4】:

      一个简单的问题:为什么是二进制?有效载荷本身是二进制的,还是您更喜欢二进制格式? 如果是前者,也可以使用带有 JSON 或 XML 的 base64 编码;它确实使用了更多的空间(~34%)和更多的处理开销,但对于许多用例来说并不一定足够重要。

      【讨论】:

        猜你喜欢
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 2014-01-06
        • 2017-01-22
        • 2012-08-27
        相关资源
        最近更新 更多