使用Python通过互联网传输数据的最轻量方式是什么?
我有两台电脑,分别在不同的地方,但都能上网。在每台电脑上,我都在运行一个Python程序,我想让它们之间可以发送和接收数据。我希望用最简单的方法来实现,同时又能保持一定的安全性。
我考虑了以下几种解决方案,但不太确定哪种是最简单的:
正如我所说,我希望这个解决方案能有一定的安全性,但简单性是最重要的要求。数据非常简单;是一个A类型的对象,里面包含一个B类型对象的列表,还有一些其他字段。
*我以前用过protobuf,所以唯一的难点就是设置HTTP服务器,我想应该用cherrypy。
5 个回答
或者你可以直接使用套接字库,自己定义数据的传输格式。
协议缓冲区(Protocol Buffers)被称为“轻量级”,是因为它们能产生非常紧凑的数据格式,这样可以节省带宽、内存和存储空间等资源。同时,它们也很通用,可以在不同的编程语言之间使用。我们在谷歌使用它们非常频繁,但不确定你是否在意这些性能特点——你似乎用“轻量级”这个词的意思和我们不太一样,你更关注的是作为程序员的心理负担,而不是计算机和网络的负担;-)
如果你不在意花费更多的带宽、内存等资源,也不在意能否用不同的编程语言来编写参与的子系统,那么协议缓冲区可能不太适合你。
如果我理解你的“有些安全”的要求没错的话,pickling
(序列化)也不合适:如果构造得当,恶意的序列化字符串可以在反序列化时在目标机器上执行任意代码。实际上,HTTP在安全性上也不是“有些安全”:这个协议并没有阻止黑客“监听”你的网络流量(所以你绝对不应该用HTTP发送机密信息,除非你在发送前对数据进行强加密,并在接收后再解密)。为了安全起见(这又取决于你对安全的定义),你需要使用HTTPS或者更简单的SSH隧道(不需要购买证书!-)。
一旦你在两台机器之间建立了SSH隧道(对于Python,paramiko
可以帮忙,但通过shell脚本或直接使用ssh
命令行客户端也不算太难;-)),你可以在这个隧道上运行任何协议(例如HTTP也可以),因为隧道的端点会作为指定的端口提供,你可以在这些端口上打开socket。我个人推荐使用JSON而不是XML来编码数据——例如,可以参考这里的一个基于JSON的RPC服务器和客户端——但我想使用Python标准库自带的XMLRPC服务器和客户端会更简单,更接近你想要的。你为什么还想要cherrypy呢?难道在这个架构的某个方面,性能突然变得比简单性更重要,而在其他情况下却是简单性优先于性能吗?这似乎是一个矛盾的架构选择!-)
最便宜、最简单的传输方式可能就是用XML-RPC。它是通过HTTP来运行的(这样你可以用HTTP的方式来保护它),而且它在标准库里,所以你可以直接使用。跟protobuf不同的是,你不需要担心创建和编译数据类型文件(因为两边都是用Python,动态类型应该不会有问题)。唯一需要注意的是,任何在XML-RPC中没有表示的类型必须被序列化或者以其他方式处理。