【问题标题】:What is the most lightweight way to transmit data over the internet using Python?使用 Python 在 Internet 上传输数据的最轻量级方式是什么?
【发布时间】:2010-02-05 23:08:55
【问题描述】:

我在地理位置分散的地方有两台电脑,都连接到互联网。在每台计算机上,我都在运行一个 Python 程序,我想从一台计算机发送和接收数据。我想尽可能使用最简单的方法,同时保持一定的安全性。

我考虑过以下解决方案,但不确定哪个最简单:

  • HTTP 服务器和客户端,使用protobuf*;
  • SOAP Web 服务和客户端(pywebsvcs 可能?);
  • SSH 隧道上的某种 IPC —— 还是 protobuf 吧?

就像我说的,我希望解决方案有点安全,但简单是最重要的要求。数据很简单; A 类型的对象,其中包含 B 类型的对象列表和一些其他字段。

*我过去使用过 protobuf,所以唯一的困难是设置 HTTP 服务器,我猜应该是cherrypy。

【问题讨论】:

  • @Nick 你对 protobuf 有什么特别不喜欢的地方?怎么没有 XML-RPC 轻量级?
  • 基于 https 的 JSON ?当然有一个 Python 库来处理 JSON。
  • @AJ 我喜欢 protobuf!我已经广泛使用它......我的意思是这对我的情况来说可能有点矫枉过正。

标签: python network-protocols


【解决方案1】:

协议缓冲区是“轻量级”的,因为它们产生非常紧凑的线路表示,从而节省带宽、内存、存储等——同时保持非常通用和跨语言。当然,我们在谷歌很多使用它们,但不清楚你是否关心这些性能特征——你似乎在与此完全不同的意义上使用“轻量级”,严格连接给你(程序员)带来(心理)负担,而不是全部给计算机和网络带来(计算)负担;-)。

如果您不关心花费更多的带宽/内存等,也不关心以不同语言对参与的子系统进行编码的能力,那么协议缓冲区可能不是您的最佳选择。

pickling 也不是,如果我正确阅读了您的“有点安全”的要求:解开适当构造的恶意腌制字符串可以在解开机器上执行任意代码。事实上,HTTP 在稍微不同的意义上并不“有点安全”:该协议中没有任何内容可以阻止入侵者“嗅探”您的流量(因此您永远不应该使用 HTTP 发送机密有效负载,除非您在在发送之前有效载荷并在接收后撤消它)。为了安全起见(同样取决于您对这个词的含义),您需要 HTTPS 或(设置更简单,不需要您购买证书!-)SSH 隧道。

一旦你在两台机器之间建立了 SSH 隧道(对于 Python,paramiko 可以提供帮助,但即使通过 shell 脚本或其他方式直接控制ssh 命令行客户端也不错;-)您可以在其上运行任何协议(例如,HTTP 很好),因为隧道端点可用作给定编号的端口,您可以在这些端口上打开套接字。我个人建议使用 JSON 而不是 XML 来编码有效负载——例如,请参阅here 了解类似 XMLRPC 的基于 JSON 的 RPC 服务器和客户端——但我想使用 Python 标准附带的 XMLRPC 服务器和客户端库更简单,因此可能更接近您正在寻找的内容。你为什么还想要cherrypy?性能现在是否突然超过了简单性,仅针对整个架构的这一方面,而在其他所有情况下,简单性都被选为性能?这似乎是一组特别矛盾的架构选择!-)

【讨论】:

  • 在这种情况下,轻量级对我来说也意味着“紧凑的表示”。请记住 SSH 也可以进行动态压缩。
  • @Alex Martelli 哈哈,是的,我的意思是轻量级,例如“更少的实现努力”,而不是“更少的计算机努力”。仅供参考,我选择了 Python 的 xml-rpc 库,因为它似乎是最简单的解决方案。
【解决方案2】:

最便宜和最简单的传输方式可能是 XML-RPC。它通过 HTTP 运行(因此您可以通过这种方式对其进行保护),它位于标准库中,并且与 protobuf 不同,您不必担心创建和编译数据类型文件(因为两端都在运行 Python,动态类型应该不是问题)。唯一需要注意的是,任何未在 XML-RPC 中表示的类型都必须经过腌制或以其他方式序列化。

【讨论】:

  • 是的,这一定是 protobuf 最令人讨厌的地方;它似乎并不轻巧。我会检查 XML-RPC。
  • 为什么不干脆泡菜呢? cPickle 很快。
  • @Antoine P. 啊,我已经实现了 xml-rpc,但我下次会尝试!
  • Pickle 速度很快,但它不提供数据的实际传输 - 只是一种序列化格式。您必须自己实现客户端和服务器。 XML-RPC 提供序列化和传输。
【解决方案3】:

或者您可以直接进入 Sockets 库并以您自己的格式简单地传输数据。

http://www.amk.ca/python/howto/sockets/

【讨论】:

    【解决方案4】:

    您可以考虑Pyro,请务必阅读Security chapter

    更新:它似乎比 Protocol Buffers 更简单,如果您的需求在未来变得更加复杂,可能需要更少的工作(他们有办法做到这一点...... :-)

    【讨论】:

    • 看起来不错,但对于我想做的事情来说,它似乎有点太强大了,你不觉得吗?
    【解决方案5】:

    当然,Alex 是对的。但是,我会说,过去我对腌制数据并通过 SSH 将其推送到另一个进程进行解封非常高兴。就是这么简单。

    但是,它不适合做很多事情。您确实需要信任传入的数据,如果我的博客服务器接收到腌制的博客文章(我的客户端解析出标签等),我绝对信任这些数据——它已经像我一样经过身份验证了。

    亚历克斯工作的谷歌是完全不同的事情。 :-)

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 2011-01-08
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多