我需要使用基本的消息/响应协议通过TCP / IP与服务器进行交互(因此对于每个请求,我将收到一个定义的响应)。
在JVM生态系统中,我认为Java Socket是15年前使用的工具,但我想知道现在JDK中是否有更合适的东西?例如,对于Java套接字,如果没有收到回复,仍然需要手动超时请求,这感觉很老式。
那么JDK或JVM领域有什么新东西吗?
答案 0 :(得分:4)
不,现在有更好的选择允许您异步实现客户端/服务器而无需额外的线程。
从nio中查看SocketChannel,或者从nio2中查看更好AsynchronousSocketChannel。请检查此tutorial
特别是后一个选项将允许您只需启动连接侦听器并注册回调,只要请求新连接,数据到达,数据写入等,就会调用回调。
还要考虑查看一些高级解决方案,例如Netty。它将负责网络核心,将负载均匀分配给执行者。另外,它提供了网络层和处理层的清除分离。对于处理层,它将为您提供许多可用于常见协议的可重用编解码器。
答案 1 :(得分:2)
您可以尝试在TCP / IP之上工作的RMI,但使用一组方便的API隐藏所有硬件。
按照本教程post
答案 2 :(得分:1)
嗯,确实有很多其他技术可供使用,例如JMS有各种各样的实现,开箱即用。
套接字是网络通信的低级构建块,就像您家中电网中的电线一样。是的,他们是老式的,是的,我们可能不想看到他们,但他们会在那里,他们将留在那里是有充分理由的。
在套接字之上,您可以例如选择HTTPUrlConnection,它实现了大部分HTTP协议。尽管如此,设置超时策略仍然掌握在您手中,我发现这些策略非常有用,并且同时非常痛苦。
http://www.mkyong.com/java/how-to-send-http-request-getpost-in-java/
您可以自由移动上面的一个抽象级别,并使用现成的REST库,例如:http://unirest.io/java.html
上面的示例连接到服务器,配置HTTP查询字符串,执行请求(超时,编码,引擎盖下的所有混乱),最后以几行代码获取Json格式的响应:
Unirest.post("http://httpbin.org/post")
.queryString("name", "Mark")
.field("last", "Polo")
.asJson();
如今,使用REST协议可以获得大量的Web服务,这是一种基于HTTP的简单命令响应。如果您有机会,我建议使用REST,因为您可以轻松找到可用的客户端和服务器端实现,并且您也不需要在命令协议层上重新发明轮子。
在客户端,unirest非常方便。在服务器端,我们在1.2.xx系列Play中拥有非常棒的体验!框架。但是那里有成千上万的东西,只是搜索" REST"。
答案 3 :(得分:1)
查看Netty Project,“ Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化并简化了TCP等网络编程和UDP套接字服务器。“
这个框架为我们提供了许多简化编程过程的功能,从而实现了很大的可扩展性。
Twitter和许多大公司都在使用技术行业。
这是来自Norman Maurer的nice presentation。