![](/img/trans.png)
[英]Networking in Java, 'readLine()' on multiple lines of response in client
[英]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.