我正在尋找一種在Python中支持的用於在一臺服務器和多個客戶端之間進行數據請求/文件傳輸的良好服務器/客戶端協議。安全也是一個問題 - 如此安全的登錄將是一個優點。我一直在研究XML-RPC,但它看起來是一個相當古老的(並且可能未被使用的)協議。最佳Python支持的服務器/客戶端協議?
回答
HTTP似乎符合您的要求,並且在Python中得到很好的支持。
Twisted適合嚴重的Python異步網絡編程,但它有一個陡峭的學習曲線,所以它可能值得使用更簡單的東西,除非你知道你的系統將需要處理大量的併發。
首先,我建議使用urllib
作爲客戶端,使用WSGI service behind Apache作爲服務器。 Apache可以設置爲相當簡單地處理HTTPS。
在RPC場,JSON-RPC會帶來很大的性能提升了XML-RPC: http://json-rpc.org/wiki/python-json-rpc
與yaml的速度比較是什麼? – 2008-09-15 17:03:07
XML-RPC是非常簡單上手,並且在我以前的工作,我們用它廣泛用於內分佈式系統中的節點通信。只要你跟蹤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的協議perspective broker (PB)或asynchronous messaging protocol (AMP)可能更適合你。 Twisted確實很好地支持了這些協議。
哦,但[請求](http://docs.python-requests.org/en/latest/index.html)*特別好。 imho – 2012-09-21 10:29:13
另請參見:https://github.com/dreid/treq – Glyph 2012-09-22 02:05:52
我建議你看看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啓用傳輸。
沒有必要使用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's thrift項目可能是一個很好的答案。它使用輕量級協議來傳遞對象,並允許您使用任何您希望的語言。它可能會降低安全性,但我相信沒有。
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。當然,所有這些選項基本上都是一樣的,它們只是有各種設置困難。
- 1. 最佳Java支持的服務器/客戶端協議?
- 2. 爲支持多協議的服務器設計客戶端
- 3. 如何告訴服務器客戶端支持SPDY協議?
- 4. 客戶端服務器,設計協議
- 5. 強制bazaar客戶端協議使用服務器協議2?
- 6. 客戶端不支持服務器請求的身份驗證協議
- 7. 從PHP/Perl到C++/Qt4的客戶端/服務器通信的最佳協議
- 8. 設計客戶端/服務器通信協議的最佳實踐
- 9. 關於流行的客戶端/服務器協議的建議
- 10. 客戶端不支持服務器請求的認證協議;考慮升級MySQL客戶端
- 11. MySQL協議客戶端/服務器Authenication - 令牌生成從客戶端
- 12. 是否MySQL的客戶機/服務器協議支持批量插入
- 13. 簡單的服務器/客戶端字符串交換協議
- 14. 更改客戶端到服務器的協議
- 15. Android中的客戶端服務器協議
- 16. 客戶端 - 服務器通信協議的架構決策
- 17. 使用OPC UA協議在python中進行服務器端客戶端編程
- 18. 支持回撥服務的WCF協議
- 19. 服務器端與客戶端端編碼的最佳實踐
- 20. C#客戶端 - 服務器協議/模型問題
- 21. 爲Android客戶端(Android)和C#服務器實現協議
- 22. 客戶端 - 服務器數據加密和協議設計
- 23. Java客戶端 - 服務器聊天協議設計
- 24. 服務器 - C#,客戶端 - 閃存,數據交換協議
- 25. Java自定義協議客戶端服務器
- 26. Java網絡服務器,協議和客戶端
- 27. 客戶端服務器協議與XML消息
- 28. UDP客戶端和服務器緩衝區協議
- 29. Netbeans 7+協作客戶端/服務器
- 30. 「協議不支持地址」當運行客戶端
你是怎麼解決這個問題的? – cmcginty 2010-04-13 01:29:14