2012-04-08 93 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多种语言绑定。