繁体   English   中英

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

[英]Best Python supported server/client protocol?

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

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

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

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

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

Google发布了ProtocolBuffers ,作为一种以非常紧凑的高效方式序列化数据的方式。 他们支持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开销。 你可以解压缩它的原因,但是你用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中的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)。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM