Java Socket仍然是Java中TCP / IP编程的首选吗?

时间:2016-02-16 11:56:22

标签: java sockets tcp

我需要使用基本的消息/响应协议通过TCP / IP与服务器进行交互(因此对于每个请求,我将收到一个定义的响应)。

在JVM生态系统中,我认为Java Socket是15年前使用的工具,但我想知道现在JDK中是否有更合适的东西?例如,对于Java套接字,如果没有收到回复,仍然需要手动超时请求,这感觉很老式。

那么JDK或JVM领域有什么新东西吗?

4 个答案:

答案 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