我是第一次在一个客户机-服务器程序上工作,我感到很遗憾,对于从哪里开始做我正在做的事情,我感到很不充分。
我将使用Google Protocol Buffers在我的客户机和服务器之间传输二进制数据。我将使用python变体。据我所知,基本思想是客户机将数据序列化,发送到服务器,然后服务器将数据反序列化。
问题是,我真的不知道从哪里开始向服务器发送二进制数据。我本来希望它像http请求那样“简单”,但我一直在google上搜索传输二进制数据的方法,并在大量的教程、指南和文档中迷失方向。我甚至不能通过调查http传输来判断我是不是找错了树(我希望使用它,所以如果需要安全性的话,我可以把它提升到https的一个级别)。不过,我真的不想进入socket编程的层次,我想在开始之前使用可用的库。(我也更喜欢标准的python库,不过如果有完美的第三方库,我会活下来。)
因此,如果有人对如何通过python传输二进制数据有一个很好的起点(或者想自己解释一下),我将不胜感激。顺便说一句,我正在运行的服务器目前正在使用mod_python运行apache。

最佳答案

任何时候你要把二进制数据从一个系统转移到另一个系统的时候,都要记住一些事情。
不同的机器以不同的方式存储相同的信息。这在内存和网络上都有意义。更多信息(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"

这太简单了,但我希望你能明白我在说什么。

07-24 18:41
查看更多