是否有针对Java的请求 - 响应网络API?

时间:2011-07-01 13:08:38

标签: java networking tcp

我正在寻找一个简单的java库,它能够以下列方式编写代码:

Remote remote = Remote.connect("some_host:1234"); 
Future<String> response = remote.request("hello");
// do something else
String reply = response.get();

它应该基于tcp / ip并使用网络上的纯文本消息与语言无关,这样非Java服务器也能够发送/接收请求/响应。

(在告诉我使用普通套接字之前,请记住,在这种情况下,你需要实现包装器来划分有效负载,关心接收到的消息重新排序,线程处理......这个例子很简单,但它不是那么琐碎实现。)

有没有这样的现有API?

PS:......越简单越好!

5 个答案:

答案 0 :(得分:1)

看看JMS

答案 1 :(得分:1)

使用普通套接字: - )

套接字使用TCP,TCP负责有效负载,多个数据包和排序。您仍然需要处理线程,但java.util.concurrent拥有您需要的所有功能。不要忘记决定字符串的字符编码。

答案 2 :(得分:1)

TCP实现通常只向应用程序提供类似流的接口,而不能访问各个数据包。 (此外,某些路由器/防火墙可能希望重新打包TCP流中的数据,这意味着它们不一定与发送的块到达相同的块。) 因此我们确实需要在TCP之上使用一些打包协议(或者在任何流对之上真正)。

一个非常简单的协议是每个请求/响应一行,但这只适用于小数据大小(或者你需要以某种方式逃避嵌入的换行符)。

如果你想要它更结构化,你可以使用基于XML的东西(比如XMPP):每个请求/响应都是一个完整的XML元素(如有必要,包括子元素)。

此外,如果您要使用请求 - 响应方案,则需要说响应必须与订购请求的顺序相同(对于同一连接上的多个请求,它不允许或至少使服务器端的并行处理复杂化,或者您必须定义请求号,然后响应将以某种方式包含它们所涉及的请求号。

作为示例,HTTP使用第一种方法(从1.1开始 - 在每个连接只有一个请求/响应对之前),而X协议使用第二种方法。

对于HTTP,已经有实现(在客户端和服务器端),它可以完全是纯文本(取决于您发送的数据)。

或者,我们可以直接在基于数据包的协议(如UDP)上构建协议。但这有UDP的常见可靠性问题,我们还需要使用消息号(将响应与请求联系起来)等 - 这可能意味着我们必须再次重新实现一半的TCP。

所以,对不起,除了使用HTTP 之外没有真正的答案。

答案 3 :(得分:0)

使用Apache Mina,您可以开发自己的协议,但这可能有点过分。

答案 4 :(得分:0)

我不知道有任何库通过套接字给你一个像这样的图层。 IMAP协议有一个非常类似的框架层,但我不知道如何独立于IMAP的其余部分使用它。这样的库很容易编写,并且可能非常有用,所以如果有人想尝试它,我鼓励他们这样做!

我能想到的最接近你想要的是ZeroMQ in request-reply mode。 ZeroMQ是用C语言编写的,但有一个Java binding。它是一个非常好的库 - 有许多语言的绑定,所以它实际上与语言无关,它确实负责划分有效负载,关心接收的消息重新排序和线程处理。不过,我不认为这是纯文本。