2012-04-08 110 views
0

我想設計一個我有幾個組件之間的協議。每個可以在不同的主機上以單獨的進程運行。始終有一個發起者(客戶端)和一個響應者(服務器)。客戶端可能使用幾種語言java/c#/ C++/cli。在我的情況下,服務器總是在java中。
所以我想到了以下屬性:通過http尋找API /協議

  • 應該由純文本,因此會很容易調試。
  • 它應該允許單方面的升級(這意味着沒有類的序列化和沒有嚴格的方法簽名)。
  • 如果它是一個框架,那麼in應該很薄(WSDL看起來太多了我的需求)。

我以爲使用http over tcp。
我主要對語法感興趣,並且如果在java中已經提供了這樣的功能的框架。我隱約記得在Spring裏有這樣的事情。

編輯:我更喜歡一個瘦框架,並且我擔心在RPC中更改方法簽名會導致競爭性問題。
我發現this example,它可能需要我的需求,因爲我已經在使用jaxb

+0

您試圖實現的是「遠程過程調用」(RPC)又名「遠程(方法)調用」(RI/RMI)。我建議你閱讀它並檢查一些框架並選擇最適合你的框架。 – dtech 2012-04-08 20:03:14

回答

1

我會去與SOAP。雖然不是最簡單的,但幾乎所有語言/平臺組合上都有各種庫,並且可以擴展。 也可能建議使用XML-RPC,但SOAP是其後繼者,所以我建議不要使用XML-RPC。

1

我會去WSDL。它實際上意味着在用各種語言編寫的組件之間建立遠程通信。我一直在C#,PHP,C++,Python和Java的重負載下使用它很長時間,這很棒。基本上,所有你需要做的是實際設計一個真正的協議,這個WSDL本身並不是 - 在這種情況下,協議將是WSDL頂部的命令集,例如, Hello Command(某種形式的ping),Login和Logout命令(用於會話)以及各種你需要的東西。

+0

Web服務總是可以的。例如,您可以從Apache CXF開始。 – 2012-04-08 19:57:50

0

您可以保持TCP級別並使用一些智能庫如zeromq來處理所有的接線。協議本身就是一組簡單的消息,並且可以根據您的需求進行調整(以及WSDL並非由傳輸基礎設施預先確定)。

實施例(I挑戰WebService的支持者以適應他們的答案的例子;)

服務器(蟒爲了簡潔):

import zmq 
ctx = zmq.Context() 
socket = ctx.socket(zmq.REP) 
socket.bind('tcp://0.0.0.0:12345') 
while True: 
    message = socket.recv() 
    # 'status' and 'shutdown server' would be part of your protocol 
    if message == "status": 
     socket.send("I'm ok") 
    elif message == "shutdown server": 
     socket.send("Ok, bye bye") 
     break 
    # implement your other commands here ... 
socket.close() 

的客戶端:

import zmq 
ctx = zmq.Context() 
socket = ctx.socket(zmq.REQ) 
socket.connect('tcp://localhost:12345') 
socket.send('shutdown server') 
reply = socket.recv() 
print(reply) 

這就是它。是的,zeromq帶有30多種語言綁定。