是否有请求–;Java响应网络API?

是否有请求–;Java响应网络API?,java,networking,tcp,Java,Networking,Tcp,我正在寻找一个简单的java库,它能够以以下方式编写代码: Remote remote = Remote.connect("some_host:1234"); Future<String> response = remote.request("hello"); // do something else String reply = response.get(); Remote=Remote.connect(“某个主机:1234”); 未来响应=远程请求(“你好”); //做点别的

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

Remote remote = Remote.connect("some_host:1234"); 
Future<String> response = remote.request("hello");
// do something else
String reply = response.get();
Remote=Remote.connect(“某个主机:1234”);
未来响应=远程请求(“你好”);
//做点别的
字符串reply=response.get();
它应该基于tcp/ip,并通过网络使用纯文本消息来实现语言无关性,以便非Java服务器也能够发送/接收请求/响应

(在告诉我使用普通套接字之前,请记住,在这种情况下,您需要实现包装器来界定有效负载,关心接收消息的重新排序、线程处理……示例很简单,但要很好地实现并不是那么简单。)

有没有像这样的API

附:……越简单越好

查看。

使用普通插座:-)


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

您可以开发自己的协议,但这可能有些过分。

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

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

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

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

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

对于HTTP,已经有了一些实现(在客户端和服务器端),并且可以将其完全变成纯文本(取决于您发送的数据)

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


所以,很抱歉,除了使用HTTP,没有其他真正的答案。

我不知道有哪个库在套接字上为您提供类似的层。IMAP协议有一个非常像这样的帧层,但是我不知道有什么方法可以独立于IMAP的其余部分来使用它。这样的库编写起来非常简单,而且可能非常有用,所以如果有人想尝试,我鼓励他们这样做


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

看:这看起来不是我真正需要的。此外,通过网络发送的消息似乎不是纯文本。是的,这就是它的包装/展开方式。那么通过网络实际发送的是什么呢。。。我怀疑它是纯文本,它可能是某种序列化对象或某种特定格式,包含字符串。还是我错了?嗯。。。从理论上讲,TCP/IP数据包具有内部所需的所有信息。。。即使需要一些“应用程序级”协议,我还是希望它是纯文本,以便与其他软件(非java)互操作。JMS不是协议,它是API,所以说它是纯文本还是非纯文本没有意义。确切地说,TextMessage的目的是,呃,封装文本消息。2个相关问题:1。基于OutputStream,如何界定单个消息的有效负载?2.如果我发送请求A、B、C,然后接收对B、A、C的响应;如何将响应分配给正确的请求?(我的意思是,输出流将读为B,A,C)@arnaud我不理解Q1。在第二季度,你应该在你的回复中包含一些关于它正在回答哪个请求的信息。第一季度…哦,很抱歉造成混淆,我指的当然是输入流。当从套接字读取数据时,您可以从InputStream访问其数据……但是,我不知道如何界定消息何时结束以及消息何时开始,您得到的只是一个字节序列,它是所有消息的串联。问题2:……是的,这就是为什么我在最初的帖子中提到,因为你还必须管理重新排序,所以需要做更多的工作1。现在我明白你的意思了。如果您在同一个连接上发送多条消息,那么实际上,您必须以某种方式对消息进行分隔。您可以简单地在消息本身之前发送每条消息的长度,或者使用一个任何人都无法在消息中使用的分隔符。2.只需编写服务器应用程序,以便以与请求相同的顺序写入答案,或者为每个请求指定一个唯一的ID,并将此ID作为响应的一部分发送。请注意,HTTP为每个连接发送一个请求(除非使用了keep alive),并且具有worke