如何使用Python传输二进制数据?

3
我第一次在做客户端服务器程序,对于我要做的事情感到非常无助。我将使用Google Protocol Buffers 在客户端和服务器之间传输二进制数据。我将使用Python变量。基本思想是,客户端将序列化数据,发送到服务器,然后服务器将反序列化数据。问题是,我真的不知道从哪里开始向服务器发送二进制数据。我希望它像HTTP请求这样“简单”,但我在谷歌上搜索了传输二进制数据的方法,并且被众多教程、指南和文档淹没了。我甚至不能确定是否通过调查HTTP传输来解决问题(我希望使用它,因此如果需要安全性,我可以升级为HTTPS)。虽然我还没有达到使用套接字编程的水平,但我真的不想去那个层面 - 我想在转向那个层面之前使用可用的库。 (我也更喜欢标准的Python库,但如果有完美的第三方库,我会使用它。)

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


我不确定你所说的“二进制数据”是什么意思。序列化数据意味着将其转换为二进制格式,而反序列化则意味着将其解包成更有用的格式。您能详细说明一下您遇到序列化问题的特定数据吗? - Jorenko
4个回答

4
任何时候,当你要从一个系统移动二进制数据到另一个系统时,有几件事情需要记住。
不同的机器以不同的方式存储相同的信息。这对内存和网络都有影响。更多信息请参考此处(http://en.wikipedia.org/wiki/Endianness)。
因为你使用的是Python,如果客户端和服务器都是Python,你可以使用cPickle来序列化你的数据。如果你真的想要二进制数据,你需要熟悉Python的struct模块(http://docs.python.org/library/struct.html),并学习如何打包/解包你的数据。
我建议先从简单的线路协议服务器开始,直到你克服了网络通信的难度。如果你以前没有做过这个,很快就会感到困惑。如何发出命令,如何传递数据,如何在错误时重新同步等等...
如果你已经知道了客户端/服务器协议设计的基础知识,那么先练习在磁盘上打包和解包二进制结构。我还参考HTTP和FTP的RFCs来处理这种情况。
-------根据评论编辑--------
通常,这种操作是通过向服务器发送一个“头部”来完成的,其中包含文件的校验和以及文件的字节数。请注意,我不是指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"

这只是一个过于简化的描述,但我希望你能理解我在这里说的话。

我已经有了数据(假设在一个文件中)-问题实际上是,我该如何传输这个文件?(我想我通过谈论二进制数据使它听起来比应该的更复杂,但我所指的是文件传输。) - Roger

3
我不确定我理解了你的问题,但也许你可以看一下Twisted项目
正如你在常见问题中所看到的,“Twisted是一个使用Python编写的网络引擎,支持众多协议。它包含一个Web服务器、众多聊天客户端、聊天服务器、邮件服务器等等。Twisted由许多子项目组成,可以单独访问[...]”。
文档相当不错,而且互联网上有很多示例。希望能够帮到你。

1

我猜这取决于您与Google Protocol Buffers的联系程度,但您可能会喜欢查看Thrift

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

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


0
一个快速的问题:为什么使用二进制?负载本身是二进制的,还是你只是更喜欢二进制格式? 如果是前者,也可以在 JSON 或 XML 中使用 base64 编码;它确实会占用更多的空间(约 34%),并且需要更多的处理开销,但对于许多用例来说可能并不足够重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接