0

我想在我拥有的几个组件之间设计一个协议。每个都可以在不同主机上的单独进程中运行。总是有一个发起者(客户端)和响应者(服务器)。客户端可能使用多种语言 java/c#/c++/cli。在我的情况下,服务器总是在 java 中。
所以我想到了以下属性:

  • 它应该是纯文本的,因此很容易调试。
  • 它应该允许从一侧无缝升级(这意味着没有类序列化和严格的方法签名)。
  • 如果它是一个框架,那么 in 应该很薄(WSDL 看起来对我的需求来说太多了)。

我想在 tcp 上使用 http。
我主要对语法感兴趣,以及 java 中是否存在已经提供此类功能的框架。我依稀记得里面有类似的东西Spring

编辑:我更喜欢瘦框架,而且我担心在 RPC 中更改方法签名会导致竞争力问题。
我找到了这个例子,它可能满足我的需求,因为我已经在使用jaxb.

4

4 回答 4

3

您可以查看 REST/ful 服务:

链接的文章还讨论了一些准则,什么时候 SOAP 和什么时候 REST 更适用。

于 2012-04-08T20:14:12.673 回答
1

我会选择SOAP。虽然不是最简单的,但几乎所有语言/平台组合都有各种库,而且它非常可扩展。也可能建议使用 XML-RPC,但 SOAP 是它的继任者,所以我建议不要使用 XML-RPC。

于 2012-04-08T20:01:17.490 回答
1

我会选择 WSDL。它实际上是为了在用各种语言编写的组件之间建立远程通信。很长时间以来,我一直在 C#、PHP、C++、Python 和 Java 的繁重负载下使用它,它很棒。基本上,您所要做的就是实际设计一个真正的协议,而 WSDL 本身并不是该协议 - 在这种情况下,协议将是 WSDL 顶部的命令集,例如 Hello Command(某种 ping),登录和注销命令(用于会话),然后是您需要的各种东西。

于 2012-04-08T19:53:14.857 回答
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 多种语言绑定。

于 2012-04-08T19:56:30.467 回答