我想在我拥有的几个组件之间设计一个协议。每个都可以在不同主机上的单独进程中运行。总有一个发起者(客户端)和响应者(服务器)。客户端可能使用多种语言java / c#/ c ++ / cli。我的服务器总是在java中 所以我考虑了以下属性:
我以为在tcp上使用http
我主要对语法感兴趣,如果java中有框架已经提供了这样的功能。我隐约记得在Spring
中有类似的东西。
编辑:我更喜欢瘦框架,而且我担心在RPC中更改方法签名会导致竞争问题。
我找到了this example,因为我已经在使用jaxb
,所以可能会满足我的需求。
答案 0 :(得分:3)
您可以查看REST / ful服务:
链接文章还讨论了一些指导原则,当SOAP和REST更适用时。
答案 1 :(得分:1)
我会选择WSDL。它实际上意味着在用各种语言编写的组件之间建立远程通信。我已经在C#,PHP,C ++,Python和Java的大量负载下长时间使用它,它非常棒。 基本上,您需要做的就是实际设计一个真正的协议,WSDL本身并不是 - 在这种情况下协议将是WSDL顶部的命令集,例如, Hello Command(某种ping),Login和Logout命令(用于会话),然后是你需要的各种东西。
答案 2 :(得分:1)
我会选择SOAP。虽然不是最简单的,但几乎所有语言/平台组合都有各种各样的库,并且它是相当可扩展的。 也可能会建议使用XML-RPC,但SOAP是其继承者,所以我建议不要使用XML-RPC。
答案 3 :(得分:0)
您可以保持TCP级别并使用zeromq之类的智能库来处理所有连接。然后,协议本身就是一组正确的消息,可以根据您的要求进行调整(并且与传输基础架构未预先确定的WSDL一样)。
示例(我挑战WebService支持者在他们的答案中填写示例;)
服务器(简称为python):
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多种语言绑定。