9

我正在寻找 Python 支持的良好服务器/客户端协议,用于在一台服务器和许多客户端之间进行数据请求/文件传输。安全性也是一个问题——因此安全登录将是一个加分项。我一直在研究 XML-RPC,但它看起来是一个相当古老的(并且可能这些天未使用?)协议。

4

11 回答 11

9

如果您希望进行文件传输,XMLRPC 可能是一个糟糕的选择。这将要求您将所有数据编码为 XML(并将其加载到内存中)。

“数据请求”和“文件传输”对我来说听起来很像普通的旧 HTTP,但是您对问题的陈述并没有明确您的要求。请求中需要编码哪些信息?像“ http://yourserver.example.com/service/request?color=yellow&flavor=banana ”这样的 URL是否足够好?

Python中有很多HTTP客户端和服务器,没有一个特别好,但我确信所有这些都可以完成基本文件传输的工作。您可以使用“普通”网络方式进行安全保护,即使用 HTTPS 和密码,这可能就足够了。

如果你想要双向通信,那么 HTTP 就会失败,而像 Twisted 的透视代理 (PB)异步消息传递协议 (AMP)这样的协议可能更适合你。Twisted 肯定会很好地支持这些协议。

于 2008-09-16T20:23:37.567 回答
7

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。当然,所有这些选项本质上都是一样的,只是设置有各种困难。

于 2008-11-15T15:16:25.433 回答
5

如果您的所有服务器/客户端都将使用 Python,那么Pyro (Python 远程对象)相当聪明。我经常使用XMPP,因为我正在与并不总是 Python 的主机进行通信。XMPP 也很容易扩展。

有一个用于 python 的优秀 XMPP 库,称为PyXMPP,它是最新的,并且不依赖于 Twisted。

于 2008-09-15T16:33:05.447 回答
4

我建议您查看 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 的传输。

于 2008-11-02T12:10:07.987 回答
3

HTTP似乎符合您的要求,并且在 Python 中得到了很好的支持。

Twisted非常适合在 Python 中进行严重的异步网络编程,但它的学习曲线很陡峭,因此除非您知道您的系统需要处理大量并发,否则可能值得使用更简单的东西。

首先,我建议使用urllib客户端和Apache 后面的 WSGI 服务作为服务器。可以将 Apache 设置为相当简单地处理 HTTPS。

于 2008-09-15T16:34:53.507 回答
2

SSH 是文件传输和远程控制的不错选择,尤其是在您关心安全登录的情况下。大多数 Linux 和 Solaris 服务器已经运行 SSH 服务进行管理,所以如果你的 Python 程序使用 ssh,那么你不需要在远程机器上打开任何额外的端口或服务。

OpenSSH是标准且可移植的 SSH 客户端和服务器,可以通过 Python 的子进程使用。如果你想要更多的灵活性,Twisted 包括Twisted Conch,它是一个 SSH 客户端和服务器实现,它在 Linux 和 Windows 上提供对 SSH 堆栈的灵活可编程控制。我在生产中使用两者。

于 2008-11-02T21:34:54.167 回答
1

我会使用 http 并从了解 Python提供的内容开始。

然后我会转向更具工业实力的Twisted库。

于 2008-09-15T16:34:45.443 回答
1

不需要使用 HTTP(实际上,在某些方面,HTTP 通常对 RPC 不利),如果您谈论的是 python 客户端与 python 服务器通信,则不需要使用基于标准的协议。

使用 Python 特定的 RPC 库,例如 Pyro,或 Twisted 提供的 (Twisted.spread)。

于 2008-11-02T12:17:54.790 回答
0

XMLRPC 上手非常简单,在我之前的工作中,我们将它广泛用于分布式系统中的节点内通信。只要您跟踪 None 值不能轻易转移的事实,它就很容易使用,并且包含在 Python 的标准库中。

通过 https 运行它并向所有调用添加用户名/密码参数,您将获得简单的安全性。不过,不确定在 Python 中验证服务器证书有多容易。

但是,如果您要传输大量数据,则编码为 XML 可能会成为瓶颈,因此在 https 上使用受REST启发的架构可能与 xmlrpclib 一样好。

于 2008-09-15T16:58:29.503 回答
0

Facebook 的节俭项目可能是一个很好的答案。它使用轻量级协议来传递对象,并允许您使用任何您想要的语言。尽管我相信没有安全性,但它可能会因安全而下降。

于 2008-11-11T13:21:44.487 回答
-1

在 RPC 领域,Json-RPC 将带来比 xml-rpc 有很大的性能提升:http: //json-rpc.org/wiki/python-json-rpc

于 2008-09-15T16:45:13.577 回答