繁体   English   中英

Java 是否存在请求-响应网络 API?

[英]Is there a request–response networking API for Java?

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

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

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

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

有没有像这样的现有 API ?

PS:...越简单越好!

看看JMS

使用普通的 sockets :-)

Sockets 使用 TCP,TCP 负责负载、多个数据包和排序。 您仍然需要处理线程,但java.util.concurrent拥有您所需要的一切。 不要忘记为您的字符串确定字符编码。

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

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

如果您希望它更有条理,您可以使用基于 XML 的东西(如 XMPP):每个请求/响应将是一个完整的 XML 元素(包括子元素,如有必要)。

此外,如果您想使用请求-响应方案,您将需要说明响应必须与请求的排序顺序相同(这不允许或至少使服务器端上的多个请求的并行处理复杂化)相同的连接),否则您将必须定义请求编号,然后响应将以某种方式包含与它们相关的请求编号。

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

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

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

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

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

我不知道有任何库可以在 sockets 上为您提供类似这样的层。 IMAP 协议有一个非常像这样的框架层,但我不知道有什么方法可以独立于 IMAP 的 rest 使用它。 这样的库很容易编写,并且可能非常有用,所以如果有人想尝试它,我鼓励他们这样做!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM