我正在寻找 Python 支持的良好服务器/客户端协议,用于在一台服务器和许多客户端之间进行数据请求/文件传输。安全性也是一个问题——因此安全登录将是一个加分项。我一直在研究 XML-RPC,但它看起来是一个相当古老的(并且可能这些天未使用?)协议。
11 回答
如果您希望进行文件传输,XMLRPC 可能是一个糟糕的选择。这将要求您将所有数据编码为 XML(并将其加载到内存中)。
“数据请求”和“文件传输”对我来说听起来很像普通的旧 HTTP,但是您对问题的陈述并没有明确您的要求。请求中需要编码哪些信息?像“ http://yourserver.example.com/service/request?color=yellow&flavor=banana ”这样的 URL是否足够好?
Python中有很多HTTP客户端和服务器,没有一个特别好,但我确信所有这些都可以完成基本文件传输的工作。您可以使用“普通”网络方式进行安全保护,即使用 HTTPS 和密码,这可能就足够了。
如果你想要双向通信,那么 HTTP 就会失败,而像 Twisted 的透视代理 (PB)或异步消息传递协议 (AMP)这样的协议可能更适合你。Twisted 肯定会很好地支持这些协议。
ProtocolBuffers由 Google 发布,作为一种以非常紧凑有效的方式序列化数据的方式。它们支持 C++、Java 和 Python。我还没有使用它,但是查看源代码,似乎每种语言都有 RPC 客户端和服务器。
我个人在几个项目中使用过 XML-RPC,它总是能达到我的预期。我通常在 C++、Java 和 Python 之间徘徊。我经常在 Python 中使用 libxmlrpc ,因为它易于记忆和交互式输入,但它实际上比替代pyxmlrpc慢得多。
PyAMF 主要用于带有 Flash 客户端的 RPC,但它也是一种值得研究的紧凑型 RPC 格式。
当两端都有 Python 时,我认为没有什么能比Pyro (Python 远程对象)更胜一筹。Pyro 甚至有一个“名称服务器”,可以让服务宣布它们对网络的可用性。客户端使用名称服务器来查找所需的服务,无论它们在特定时刻处于活动状态。这为您提供了免费的冗余,并且能够将服务从一台机器移动到另一台机器而无需任何停机时间。
为了安全起见,我会通过 SSH 进行隧道传输,或者在连接级别使用 TLS 或 SSL。当然,所有这些选项本质上都是一样的,只是设置有各种困难。
如果您的所有服务器/客户端都将使用 Python,那么Pyro (Python 远程对象)相当聪明。我经常使用XMPP,因为我正在与并不总是 Python 的主机进行通信。XMPP 也很容易扩展。
有一个用于 python 的优秀 XMPP 库,称为PyXMPP,它是最新的,并且不依赖于 Twisted。
我建议您查看 1. XMLRPC 2. JSONRPC 3. SOAP 4. REST/ATOM XMLRPC 是一个有效的选择。别担心它太旧了。那不是问题。它是如此简单,与原始规范相比几乎不需要更改。优点是,在我知道的每一种编程语言中,都有一个供客户端编写的库。当然对于 python 而言。我让它与 mod_python 一起工作,完全没有问题。它的最大问题是它的冗长。对于简单的值,有很多 XML 开销。您可以无缘无故地对其进行 gzip,但是使用 Fiddler 之类的工具会失去一些调试能力。
我个人的偏好是 JSONRPC。它具有 XMLRPC 的所有优点并且非常紧凑。此外,Javascript 客户端可以“评估”它,因此不需要解析。它们中的大多数都是为标准的 1.0 版构建的。我已经看到了各种改进它的尝试,称为 1.1 1.2 和 2.0,但它们并不是建立在另一个之上,而且据我所知,它们还没有得到广泛的支持。2.0 看起来最好,但我现在仍会坚持使用 1.0(2008 年 10 月)
第三个候选者是 REST/ATOM。REST 是一个原则,而 ATOM 是您在 POST、PUT 请求和 GET 响应需要时传输大量数据的方式。对于它的一个非常好的实现,请查看 Google 的 API GData。真真好。
SOAP 很旧,很多库/语言都支持它。IT 繁重而复杂,但如果您的主要客户是 .NET 或 Java,则可能值得费心。Visual Studio 将导入您的 WSDL 文件并创建一个包装器,对于 C# 程序员来说,它确实看起来像本地程序集。
所有这一切的好处是,如果您正确构建解决方案,现有的 Python 库将允许您支持多个库,而几乎没有开销。XMLRPC 和 JSONRPC 是特别好的搭配。
关于身份验证。XMLRPC 和 JSONRPC 不需要定义一个。它与序列化无关。因此,您可以使用其中任何一种来实现基本身份验证、摘要式身份验证或您自己的身份验证。我已经看到了几个用于 python 的客户端摘要身份验证示例,但还没有看到基于服务器的示例。如果您使用 Apache,则可能不需要,而是使用 mod_auth_digest Apache 模块。这取决于您的应用程序的性质
运输安全。它显然是 SSL (HTTPS)。我目前不记得 XMLRPC 是如何处理的,但是对于我拥有的 JSONRPC 实现来说,这很简单——您只需将 URL 中的 http 更改为 https,它就会通过启用 SSL 的传输。
HTTP似乎符合您的要求,并且在 Python 中得到了很好的支持。
Twisted非常适合在 Python 中进行严重的异步网络编程,但它的学习曲线很陡峭,因此除非您知道您的系统需要处理大量并发,否则可能值得使用更简单的东西。
首先,我建议使用urllib
客户端和Apache 后面的 WSGI 服务作为服务器。可以将 Apache 设置为相当简单地处理 HTTPS。
SSH 是文件传输和远程控制的不错选择,尤其是在您关心安全登录的情况下。大多数 Linux 和 Solaris 服务器已经运行 SSH 服务进行管理,所以如果你的 Python 程序使用 ssh,那么你不需要在远程机器上打开任何额外的端口或服务。
OpenSSH是标准且可移植的 SSH 客户端和服务器,可以通过 Python 的子进程使用。如果你想要更多的灵活性,Twisted 包括Twisted Conch,它是一个 SSH 客户端和服务器实现,它在 Linux 和 Windows 上提供对 SSH 堆栈的灵活可编程控制。我在生产中使用两者。
不需要使用 HTTP(实际上,在某些方面,HTTP 通常对 RPC 不利),如果您谈论的是 python 客户端与 python 服务器通信,则不需要使用基于标准的协议。
使用 Python 特定的 RPC 库,例如 Pyro,或 Twisted 提供的 (Twisted.spread)。
XMLRPC 上手非常简单,在我之前的工作中,我们将它广泛用于分布式系统中的节点内通信。只要您跟踪 None 值不能轻易转移的事实,它就很容易使用,并且包含在 Python 的标准库中。
通过 https 运行它并向所有调用添加用户名/密码参数,您将获得简单的安全性。不过,不确定在 Python 中验证服务器证书有多容易。
但是,如果您要传输大量数据,则编码为 XML 可能会成为瓶颈,因此在 https 上使用受REST启发的架构可能与 xmlrpclib 一样好。
Facebook 的节俭项目可能是一个很好的答案。它使用轻量级协议来传递对象,并允许您使用任何您想要的语言。尽管我相信没有安全性,但它可能会因安全而下降。
在 RPC 领域,Json-RPC 将带来比 xml-rpc 有很大的性能提升:http: //json-rpc.org/wiki/python-json-rpc