最佳Python支持的服务器/客户端协议?

问题描述:

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

+3

你是怎么解决这个问题的? – cmcginty 2010-04-13 01:29:14

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

有一个很好的XMPP库python叫PyXMPP是合理的最新的,并没有依赖Twisted。

我会使用http,并开始了解Python library提供什么。

然后我会转移到更多的工业实力Twisted库。

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

Twisted适合严重的Python异步网络编程,但它有一个陡峭的学习曲线,所以它可能值得使用更简单的东西,除非你知道你的系统将需要处理大量的并发。

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

在RPC场,JSON-RPC会带来很大的性能提升了XML-RPC: http://json-rpc.org/wiki/python-json-rpc

+0

与yaml的速度比较是什么? – 2008-09-15 17:03:07

XML-RPC是非常简单上手,并且在我以前的工作,我们用它广泛用于内分布式系统中的节点通信。只要你跟踪None值无法轻易传输的事实,它就很容易处理,并且包含在Python的标准库中。

通过https运行它并为所有呼叫添加一个用户名/密码参数,并且您将具有简单的安全性。但是,不确定在Python中验证服务器证书是多么容易。

但是,如果您要传输大量数据,则将代码编码为XML可能会成为瓶颈,因此通过https使用REST-启发式体系结构可能与xmlrpclib一样好。

如果你正在寻找文件传输,XMLRPC可能是一个不错的选择。它将要求您将所有数据编码为XML(并将其加载到内存中)。

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

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

如果你想双向通信,那么HTTP会下降,像Twisted的协议perspective broker (PB)asynchronous messaging protocol (AMP)可能更适合你。 Twisted确实很好地支持了这些协议。

+0

哦,但[请求](http://docs.python-requests.org/en/latest/index.html)*特别好。 imho – 2012-09-21 10:29:13

+0

另请参见:https://github.com/dreid/treq – Glyph 2012-09-22 02:05:52

我建议你看看1. XMLRPC 2. JSONRPC 3. SOAP 4. REST/ATOM XMLRPC是一个有效的选择。不要担心它太旧了。这不是问题。它很简单,很少需要改变,因为原来的规格。亲是,在每一种编程语言我知道有一个客户端库的写入。当然对于Python。我使用mod_python工作,并没有任何问题。 它的大问题是它的冗长。对于简单的值,存在很多XML开销。你可以把它当作原因,然后你用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响应时传送大量数据的方式。 对于一个非常好的实现,请看GData,Google的API。真的很好。

SOAP很旧,很多库/语言都支持它。 IT非常复杂,但如果您的主要客户端是.NET或Java,则可能值得费心。 Visual Studio会导入你的WSDL文件并创建一个包装器,并且对于C#程序员来说,它确实看起来像本地组装。

所有这一切的好处是,如果你正确地设计你的解决方案,Python的现有库将允许你支持多一点而几乎没有开销。 XMLRPC和JSONRPC特别好匹配。

关于认证。 XMLRPC和JSONRPC不打算定义一个。从系列化是独立的事情。所以你可以实现基本身份验证,摘要式身份验证或你自己的任何一种。我已经看到了几个python客户端摘要身份验证的例子,但我还没有看到基于服务器的。如果使用Apache,则可能不需要使用Apache,而是使用mod_auth_digest Apache模块。这取决于您的应用程序的性质

传输安全性。它很明显是SSL(HTTPS)。目前我还不记得XMLRPC是如何处理的,但是通过JSONRPC实现,我已经知道它是微不足道的 - 只需将您的URL中的http更改为https以JSONRPC,并且它将通过SSL启用传输。

没有必要使用HTTP(实际上,HTTP在某些方面通常不适用于RPC),并且如果您正在讨论一个Python客户端与Python进行对话时,不需要使用基于标准的协议服务器。

使用特定于Python的RPC库(如Pyro)或Twisted提供的内容(Twisted.spread)。

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

OpenSSH是标准和便携式SSH客户端和服务器,可以通过Python的子进程使用。如果您想要更高的灵活性Twisted包括Twisted Conch这是一个SSH客户端和服务器实现,它可以在Linux和Windows上提供灵活的SSH堆栈可编程控制。我在生产中都使用它们。

Facebook's thrift项目可能是一个很好的答案。它使用轻量级协议来传递对象,并允许您使用任何您希望的语言。它可能会降低安全性,但我相信没有。

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