3

我是第一次在客户端-服务器程序上工作,可悲的是,我不知道从哪里开始我正在做的事情。

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

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

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

4

4 回答 4

4

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

不同的机器以不同的方式存储相同的信息。这对内存和网络都有影响。更多信息在这里(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"

这过于简化了,但我希望你能看到我在这里谈论的内容。

于 2009-04-22T02:28:37.800 回答
3

我不确定我的问题是否正确,但也许你可以看看扭曲的项目

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

文档很不错,网上也有很多例子。希望能帮助到你。

于 2009-04-22T02:50:27.687 回答
1

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

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

有一个很好的例子可以开始他们的主页。

于 2009-04-22T03:19:03.980 回答
0

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

于 2009-04-22T03:24:39.427 回答