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

时间:2008-09-15 16:27:47

标签: python client

我正在寻找一种支持Python的良好服务器/客户端协议,用于在一台服务器和多个客户端之间进行数据请求/文件传输。安全性也是一个问题 - 因此安全登录将是一个优势。我一直在研究XML-RPC,但它看起来是一个非常古老的(现在可能还没用?)协议。

11 个答案:

答案 0 :(得分:9)

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

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

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

如果你想要双向通信,那么HTTP就会崩溃,像Twisted的perspective broker (PB)asynchronous messaging protocol (AMP)这样的协议可能会更适合你。 Twisted肯定很好地支持这些协议。

答案 1 :(得分:7)

谷歌发布了

ProtocolBuffers作为一种以非常紧凑的高效方式序列化数据的方法。他们支持C ++,Java和Python。我还没有使用它,但从源头看,似乎每种语言都有RPC客户端和服务器。

我个人在几个项目中使用过XML-RPC,它总是完全按照我的意愿行事。我通常介于C ++,Java和Python之间。我经常在Python中使用libxmlrpc,因为它易于记忆和交互式输入,但它实际上比替代pyxmlrpc慢得多。

PyAMF主要用于带有Flash客户端的RPC,但它也是一种值得关注的紧凑型RPC格式。

当你在两端都有Python时,我不相信任何事情都会超过Pyro(Python远程对象。)Pyro甚至还有一个“名称服务器”,它可以让服务宣布它们对网络的可用性。客户端使用名称服务器来查找它所需的服务,无论它们在特定时刻处于何种活动状态。这为您提供了免费冗余,并且能够在不停机的情况下将服务从一台机器移动到另一台机器。

为了安全起见,我通过SSH进行隧道传输,或者在连接级别使用TLS或SSL。当然,所有这些选项基本相同,只是设置有各种困难。

答案 2 :(得分:5)

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

有一个名为PyXMPP的优秀的python XMPP库,该库是合理的最新版本,并且不依赖于Twisted。

答案 3 :(得分:4)

我建议你看看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已经过时了,很多库/语言都支持它。它非常复杂,但如果您的主要客户端是.NET或Java,那么可能值得一试。 Visual Studio将导入您的WSDL文件并创建一个包装器,而对于C#程序员来说,它看起来就像是本地组件。

关于这一切的好处是,如果你正确构建你的解决方案,Python的现有库将允许你支持多一个几乎没有开销。 XMLRPC和JSONRPC特别匹配。

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

运输安全。它显然是SSL(HTTPS)。我目前还不记得XMLRPC是如何处理的,但是使用JSONRPC实现我觉得它很简单 - 您只需将URL中的http更改为JSONRPC,并且它将通过启用SSL的传输。

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:2)

SSH可以是文件传输和远程控制的不错选择,尤其是在您关注安全登录时。大多数Linux和Solaris服务器已经运行SSH服务进行管理,因此如果您的Python程序使用ssh,则无需在远程计算机上打开任何其他端口或服务。

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

答案 6 :(得分:1)

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

然后我将进入更具工业实力的Twisted库。

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

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

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

但是,如果要传输大量数据,编码到XML可能会成为瓶颈,因此使用基于REST的灵感架构而不是https可能与xmlrpclib一样好。

答案 9 :(得分:0)

Facebook's thrift项目可能是一个很好的答案。它使用轻量级协议传递对象,并允许您使用任何您想要的语言。虽然我认为没有安全措施,但它可能会降低安全性。

答案 10 :(得分:-1)

在RPC字段中,Json-RPC将比xml-rpc带来更大的性能提升: http://json-rpc.org/wiki/python-json-rpc