2008-09-15 191 views
9

我正在尋找一種在Python中支持的用於在一臺服務器和多個客戶端之間進行數據請求/文件傳輸的良好服務器/客戶端協議。安全也是一個問題 - 如此安全的登錄將是一個優點。我一直在研究XML-RPC,但它看起來是一個相當古老的(並且可能未被使用的)協議。最佳Python支持的服務器/客戶端協議?

+3

你是怎麼解決這個問題的? – cmcginty 2010-04-13 01:29:14

回答

5

Pyro(Python遠程對象)如果你所有的服務器/客戶端都將在Python中,那麼它相當聰明。我使用XMPP很多,因爲我正在與並不總是Python的主機進行通信。 XMPP也可以相當容易地擴展。

有一個很好的XMPP庫python叫PyXMPP是合理的最新的,並沒有依賴Twisted。

1

我會使用http,並開始瞭解Python library提供什麼。

然後我會轉移到更多的工業實力Twisted庫。

3

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

Twisted適合嚴重的Python異步網絡編程,但它有一個陡峭的學習曲線,所以它可能值得使用更簡單的東西,除非你知道你的系統將需要處理大量的併發。

首先,我建議使用urllib作爲客戶端,使用WSGI service behind Apache作爲服務器。 Apache可以設置爲相當簡單地處理HTTPS。

0

XML-RPC是非常簡單上手,並且在我以前的工作,我們用它廣泛用於內分佈式系統中的節點通信。只要你跟蹤None值無法輕易傳輸的事實,它就很容易處理,並且包含在Python的標準庫中。

通過https運行它併爲所有呼叫添加一個用戶名/密碼參數,並且您將具有簡單的安全性。但是,不確定在Python中驗證服務器證書是多麼容易。

但是,如果您要傳輸大量數據,則將代碼編碼爲XML可能會成爲瓶頸,因此通過https使用REST-啓發式體系結構可能與xmlrpclib一樣好。

9

如果你正在尋找文件傳輸,XMLRPC可能是一個不錯的選擇。它將要求您將所有數據編碼爲XML(並將其加載到內存中)。

「數據請求」和「文件傳輸」聽起來很像普通的舊HTTP給我,但您對這個問題的陳述並沒有使您的需求清晰。請求中需要編碼什麼樣的信息?像「http://yourserver.example.com/service/request?color=yellow&flavor=banana」這樣的URL是否足夠好?

Python中有很多HTTP客戶端和服務器,其中沒有一個特別好,但我確信所有這些都將完成基本文件傳輸的工作。您可以使用安全的「正常」網絡方式,即使用HTTPS和密碼,這可能就足夠了。

如果你想雙向通信,那麼HTTP會下降,像Twisted的協議perspective broker (PB)asynchronous messaging protocol (AMP)可能更適合你。 Twisted確實很好地支持了這些協議。

+0

哦,但[請求](http://docs.python-requests.org/en/latest/index.html)*特別好。 imho – 2012-09-21 10:29:13

+0

另請參見:https://github.com/dreid/treq – Glyph 2012-09-22 02:05:52

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很舊,很多庫/語言都支持它。 IT非常複雜,但如果您的主要客戶端是.NET或Java,則可能值得費心。 Visual Studio會導入你的WSDL文件並創建一個包裝器,並且對於C#程序員來說,它確實看起來像本地組裝。

所有這一切的好處是,如果你正確地設計你的解決方案,Python的現有庫將允許你支持多一點而幾乎沒有開銷。 XMLRPC和JSONRPC特別好匹配。

關於認證。 XMLRPC和JSONRPC不打算定義一個。從系列化是獨立的事情。所以你可以實現基本身份驗證,摘要式身份驗證或你自己的任何一種。我已經看到了幾個python客戶端摘要身份驗證的例子,但我還沒有看到基於服務器的。如果使用Apache,則可能不需要使用Apache,而是使用mod_auth_digest Apache模塊。這取決於您的應用程序的性質

傳輸安全性。它很明顯是SSL(HTTPS)。目前我還不記得XMLRPC是如何處理的,但是通過JSONRPC實現,我已經知道它是微不足道的 - 只需將您的URL中的http更改爲https以JSONRPC,並且它將通過SSL啓用傳輸。

1

沒有必要使用HTTP(實際上,HTTP在某些方面通常不適用於RPC),並且如果您正在討論一個Python客戶端與Python進行對話時,不需要使用基於標準的協議服務器。

使用特定於Python的RPC庫(如Pyro)或Twisted提供的內容(Twisted.spread)。

1

對於文件傳輸和遠程控制,SSH可以是一個不錯的選擇,特別是如果您關心安全登錄。大多數Linux和Solaris服務器已經運行SSH服務進行管理,所以如果你的Python程序使用ssh,那麼你不需要在遠程機器上打開任何額外的端口或服務。

OpenSSH是標準和便攜式SSH客戶端和服務器,可以通過Python的子進程使用。如果您想要更高的靈活性Twisted包括Twisted Conch這是一個SSH客戶端和服務器實現,它可以在Linux和Windows上提供靈活的SSH堆棧可編程控制。我在生產中都使用它們。

0

Facebook's thrift項目可能是一個很好的答案。它使用輕量級協議來傳遞對象,並允許您使用任何您希望的語言。它可能會降低安全性,但我相信沒有。

7

ProtocolBuffers是Google發佈的一種以非常緊湊有效的方式序列化數據的方式。他們支持C++,Java和Python。我還沒有使用它,但看看源代碼,似乎每種語言都有RPC客戶端和服務器。

我個人在幾個項目中使用過XML-RPC,它總是完全按照我所希望的。我通常使用C++,Java和Python。我經常在Python中使用libxmlrpc,因爲它很容易記憶和輸入交互,但實際上它比替代pyxmlrpc慢得多。

PyAMF主要針對使用Flash客戶端的RPC,但它也是值得關注的緊湊RPC格式。

當你兩端都有Python時,我不相信任何東西會跳動Pyro(Python遠程對象)。Pyro甚至有一個「名稱服務器」,可以讓服務向網絡宣佈它們的可用性。客戶使用名稱服務器來查找所需的服務,無論他們在特定時刻處於活動狀態。這爲您提供了免費的冗餘,並且可以在不停機的情況下將服務從一臺機器移至另一臺機器。

爲了安全起見,我會通過SSH隧道,或者在連接級別使用TLS或SSL。當然,所有這些選項基本上都是一樣的,它們只是有各種設置困難。

相關問題