最佳的Python支持的服务器/客户端协议?
我正在寻找Python支持的良好服务器/客户端协议,以在一台服务器和许多客户端之间进行数据请求/文件传输。安全也是一个问题,因此安全登录将是一个加号。我一直在研究XML-RPC,但是它看起来已经很老了(这些天可能还没有使用?)。
解决方案
回答
如果所有服务器/客户端都将使用Python,则Pyro(Python远程对象)非常聪明。我使用XMPP的原因很多,因为我正在与并非总是Python的主机通信。 XMPP也很容易扩展。
有一个优秀的python XMPP库称为PyXMPP,它是最新的,并且不依赖Twisted。
回答
我将使用http并首先了解Python库提供的内容。
然后,我将介绍更具工业实力的Twisted库。
回答
HTTP似乎很适合要求,并且在Python中得到了很好的支持。
Twisted对于使用Python进行认真的异步网络编程非常有用,但是它具有陡峭的学习曲线,因此除非我们知道系统需要处理大量并发性,否则可能值得使用更简单的方法。
首先,我建议对客户端使用urllib
,对服务器使用Apache后面的WSGI服务。可以将Apache设置为相当简单地处理HTTPS。
回答
在RPC领域,Json-RPC将比xml-rpc带来巨大的性能提升:
http://json-rpc.org/wiki/python-json-rpc
回答
XMLRPC入门非常简单,在我之前的工作中,我们将它广泛用于分布式系统中的节点内通信。只要我们跟踪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的透视图代理(PB)或者异步消息传递协议(AMP)这样的协议可能更适合我们。这些协议肯定受到Twisted的良好支持。
回答
我建议我们看一下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响应时传递大量数据的方式。
对于它的一个非常好的实现,请看一下Google的API GData。真的真的很好。
SOAP很老,有很多库/语言支持它。 IT既复杂又复杂,但是如果主要客户端是.NET或者Java,那么值得一试。
Visual Studio将导入WSDL文件并创建一个包装器,对于Cprogrammer来说,它的确看起来像本地程序集。
所有这一切的好处是,如果我们正确地构建解决方案,那么现有的Python库将允许我们在几乎没有开销的情况下支持更多的库。 XMLRPC和JSONRPC非常匹配。
关于身份验证。 XMLRPC和JSONRPC不必麻烦定义一个。它是独立于序列化的东西。因此,我们可以实现基本身份验证,摘要式身份验证或者我们自己的任何一种。我已经看到了几个用于python的客户端摘要身份验证的示例,但是还没有看到基于服务器的示例。如果使用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的旧项目可能是一个很好的答案。它使用轻量级协议来传递对象,并允许我们使用所需的任何语言。尽管我认为没有安全措施,但它可能会降低安全性。
回答
Google发布了ProtocolBuffers,以一种非常紧凑,高效的方式序列化数据的方式。他们支持C ++,Java和Python。我还没有使用过它,但是从源头上看,每种语言似乎都有RPC客户端和服务器。
我个人曾在多个项目中使用过XML-RPC,而且它始终完全符合我的期望。我通常在C ++,Java和Python之间切换。我经常在Python中使用libxmlrpc,因为它易于记忆和交互键入,但实际上比其他pyxmlrpc慢得多。
PyAMF主要用于带有Flash客户端的RPC,但是它是一种紧凑的RPC格式,也值得一看。
当两端都装有Python时,我相信Pyro(Python远程对象)不会比Pyro更胜一筹。Pyro甚至拥有一个"名称服务器",该名称服务器可以使服务宣布其对网络的可用性。客户端使用名称服务器来查找所需的服务,而不管它们在特定时刻处于活动状态。这为我们提供了免费的冗余,并且能够将服务从一台计算机转移到另一台计算机,而无需停机。
为了安全起见,我会通过SSH建立隧道,或者在连接级别使用TLS或者SSL。当然,所有这些选项本质上都是相同的,只是它们具有各种设置上的困难。