簡體   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