[英]python socket server/client protocol with unstable client connection
[英]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。 当然,所有这些选项基本相同,它们只有各种设置难度。
我建议你看看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的传输。
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)。
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.