我在地理位置分散的地方有两台计算机,都连接到互联网。在每台计算机上,我正在运行一个Python程序,我想从一个到另一个发送和接收数据。我想尽可能使用最简单的方法,同时保持一定的安全性。
我考虑过以下解决方案,但我不确定哪个是最简单的:
就像我说的,我希望解决方案有点安全,但简单是最重要的要求。数据非常简单;类型A的对象,包含类型B的对象列表和其他一些字段。
*我过去使用过protobuf,所以唯一的困难就是设置HTTP服务器,我想这会很棒。
答案 0 :(得分:9)
协议缓冲区是“轻量级”的,因为它们可以生成非常紧凑的线路表示,从而节省带宽,内存,存储等 - 同时保持非常通用和跨语言。当然,我们在Google上使用它们很多,但目前尚不清楚您是否关心这些性能特征 - 您似乎使用“轻量级”,与此截然不同,严格连接(精神)加载你,程序员,而不是计算机和网络上的(计算)负载; - )。
如果你不关心花费更多的带宽/内存/等等,而且你也不关心用不同语言编写参与子系统代码的能力,那么协议缓冲区对你来说可能不是最理想的。 / p>
如果我正确地阅读了你的“有点安全”的要求,那么pickling
都不是:取消对适当构造的恶意腌制字符串的破坏可以在unpickling机器上执行任意代码。实际上,HTTP在某种程度上并不是“有点安全”:该协议中没有任何内容可以阻止入侵者“嗅探”您的流量(因此您不应该使用HTTP来发送机密有效负载,除非您使用强加密发送之前的有效负载,并在接收之后撤消它)。为了安全(再次取决于你对这个词的含义),你需要HTTPS或(更简单的设置,不需要你购买证书! - )SSH隧道。
一旦你在两台机器之间建立了SSH隧道(对于Python,paramiko
可以提供帮助,但即使是通过shell脚本或者通过直接控制ssh
命令行客户端来实现它也不是坏;-)你可以在它上面运行任何协议(例如,HTTP很好),因为隧道端点可以作为给定的编号端口使用,您可以在其上打开套接字。我个人会推荐使用JSON而不是XML来编码有效负载 - 例如,请参阅here了解类似XMLRPC的基于JSON的RPC服务器和客户端 - 但我想使用随附的XMLRPC服务器和客户端Python的标准库甚至更简单,因此可能更接近您正在寻找的内容。你为什么还想要樱桃?对于整个架构的这个方面,性能现在突然超越了简单性,而在其他所有情况下,简单性都取决于性能吗?这似乎是一组特别矛盾的建筑选择! - )
答案 1 :(得分:3)
最便宜和最简单的传输方式可能是XML-RPC。它运行在HTTP上(所以你可以这样保护它),它在标准库中,与protobuf不同,你不必担心创建和编译你的数据类型文件(因为两端都运行Python,动态类型应该不是问题)。唯一需要注意的是,任何未在XML-RPC中表示的类型都必须进行pickle或序列化。
答案 2 :(得分:1)
或者您可以直接进入套接字库,只需以您自己的格式传输数据。
答案 3 :(得分:0)
您可以考虑Pyro,请务必阅读Security chapter。
更新:设置比协议缓冲区更简单,如果您的需求在未来变得更加复杂,可能需要更少的工作(他们有办法做到这一点...... :-) < / p>
答案 4 :(得分:0)
但是,它不适合很多东西。你真的需要相信传入的数据,如果我的博客服务器收到了一个腌制的博客帖子(我的客户端解析了标签等),我绝对相信数据 - 它已经像我一样经过身份验证。
亚历克斯工作的谷歌是完全不同的事情。 : - )