关键词:
一、不选择Java原生NIO编程的原因
(1)NIO的类库和API复杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等
(2)需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量NIO程序。
(3)可靠性能力补齐,工作量和难度都非常大。例如客户端面临断链重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题,NIO编程的特点是功能开发相对容易,但是可靠性能力补齐的工作量和难度非常大。
(4)JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK 1.6 版本的update 18修复了该问题,但是直到JDK 1.7版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有得到根本性解决。
二、Netty 优点
(1)API使用简单,开发门槛低
(2)功能强大,预置了多种编解码功能,支持多种主流协议
(3)定制能力强,可以通过ChannelHandler 对通信框架进行灵活地扩展
(4)性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优
(5)成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼
(6)社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入
(7)经历了大规模的商业应用考验,质量得到验证。Netty 在互联网、大数据、网络游戏、企业应用、电信软件的 众多行业已经得到了成功商业,证明它已经完全能够满足不同行业的商业应用了
三、Netty服务端Demo
import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; /** * Netty 时间服务器服务端TimeServer */ public class TimeServer public void bind(int port) EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024).childHandler(new ChildChannelHandler()); //绑定端口,同步等待成功 ChannelFuture f = b.bind(port).sync(); //等待服务端监听端口关闭 f.channel().closeFuture().sync(); catch (Exception e) e.printStackTrace(); finally //优雅退出,释放线程池资源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); private class ChildChannelHandler extends ChannelInitializer<SocketChannel> @Override protected void initChannel(SocketChannel socketChannel) throws Exception socketChannel.pipeline().addLast(new TimeServerHandler()); public static void main(String[] args) int port = 8080; new TimeServer().bind(port); import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; import java.util.Date; public class TimeServerHandler extends ChannelHandlerAdapter @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception ByteBuf buf = (ByteBuf) msg; byte[] req = new byte[buf.readableBytes()]; buf.readBytes(req); String body = new String(req,"UTF-8"); System.out.println("The time server receive order : "+body); String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body)?new Date(System.currentTimeMillis()).toString():"BAD ORDER"; ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes()); ctx.write(resp); @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception ctx.flush(); @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception ctx.close();
四、Netty的客户端Demo
import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; /** * Created by ThinkPad on 2019/6/17. */ public class TimeClient public void connect(int port,String host) EventLoopGroup group = new NioEventLoopGroup(); try Bootstrap b = new Bootstrap(); b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY,true).handler(new ChannelInitializer<SocketChannel>() @Override protected void initChannel(SocketChannel socketChannel) throws Exception socketChannel.pipeline().addLast(new TimeClientHandler()); ); //发起异步连接操作 ChannelFuture f = b.connect(host,port).sync(); //等待客户端连接操作 f.channel().closeFuture().sync(); catch (Exception e) e.printStackTrace(); finally //优雅退出,释放NIO线程组 group.shutdownGracefully(); public static void main(String[] args) int port = 8080; new TimeClient().connect(port,"127.0.0.1"); import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; /** * Created by ThinkPad on 2019/6/17. */ public class TimeClientHandler extends ChannelHandlerAdapter private final ByteBuf firstMessage; public TimeClientHandler() byte[] req = "QUERY TIME ORDER".getBytes(); firstMessage = Unpooled.buffer(req.length); firstMessage.writeBytes(req); @Override public void channelActive(ChannelHandlerContext ctx) throws Exception ctx.writeAndFlush(firstMessage); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception ByteBuf buf = (ByteBuf)msg; byte[] req = new byte[buf.readableBytes()]; buf.readBytes(req); String body = new String(req,"UTF-8"); System.out.println("Now is : "+body); @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception ctx.close();
五、测试运行结果
先运行Netty 服务端,然后在运行Netty 客户端
运行结果如下:
基于nio的网络通信框架——netty(代码片段)
...09;本质:JBoss做的一个Jar包2)目的:快速开发高性能、高可靠性的网络服务器和客户端程序3)优点:提供异步的、事件驱动的网络应用程序框架和工具 查看详情
一篇文章,读懂netty的高性能架构之道(代码片段)
一篇文章,读懂Netty的高性能架构之道Netty是由JBOSS提供的一个java开源框架,是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Liste... 查看详情
netty框架之深入了解nio核心组件(代码片段)
...开始,小编开始学习Netty框架,Netty作为底层网络通信框架可以说是无处不在。比如Duboo、Zookeeper、Elasticsearch、Jboss等底层都是依赖了它。但很少人会在工作中直接接触到Netty,原因:第一是底层(封装好了使用... 查看详情
netty框架之概述及基本组件介绍(代码片段)
概述Netty是由JBOSS提供的一个java开源框架,是一个高性能、高可扩展性的异步事件驱动的网络应用程序框架,它极大地简化了TCP和UDP客户端和服务器开发等网络编程。NIO有下面的缺点:JDK的NIO底层由epoll实现,该实... 查看详情
原创nio框架入门:android与mina2netty4的跨平台udp双向通信实战
...的完整Demo。当前由于NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文)。... 查看详情
netty3入门案例(代码片段)
...个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说它是一个NIO框架,使用它可以简单快速地开发网络应用程序。Netty大大简化了网络程序的开发过程比如TCP和UDP的... 查看详情
读懂netty的高性能架构之道
Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。... 查看详情
即时通讯开发框架之nio框架中netty的高性能之道
Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机... 查看详情
netty_02_高性能的nio框架(代码片段)
文章目录一、前言二、从NIO到RPC(原理)2.1磁盘IO和网络IO2.2JavaIO的三个阶段(bio-nio-aio)同步阻塞IO(BIO)非阻塞IO(NIO)多路复用机制(select、poll、epoll)异步IO2.3Reactor三种模式单线程单Reactor模型多线程单Reactor模型多线... 查看详情
学习010netty异步通信框架(代码片段)
...信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。Netty应用场景1.分布式开源框架中dubbo、Zookeeper,RocketMQ底层rpc通讯使用就是netty。2.游戏开发中,底层使用netty通讯。为什么选择netty在本... 查看详情
netty系列之netty高性能之道
...据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编 查看详情
netty系列之netty高性能之道
...据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精心的设 查看详情
netty系列之netty高性能之道
...据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精心的 查看详情
netty_02_高性能的nio框架(代码片段)
文章目录一、前言二、从NIO到RPC(原理)2.1磁盘IO和网络IO2.2JavaIO的三个阶段(bio-nio-aio)同步阻塞IO(BIO)非阻塞IO(NIO)多路复用机制(select、poll、epoll)异步IO2.3Reactor三种模式单线程单Reactor模型多线程单Reactor模型多线... 查看详情
nettyssl安全认证(代码片段)
1、Netty面临的安全风险作为一个高性能的NIO通讯框架,基于Netty的行业应用非常广泛,面临的安全挑战也不同。下面分析Netty面临的安全挑战。应用场景一:目前高性能的NIO框架成为RPC的分布式服务框架的基石,内... 查看详情
netty3入门案例(代码片段)
...个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说它是一个NIO框架,使用它可以简单快速地开发网络应用程序。Netty大大简化了网络程序的开发过程比如TCP和UDP的... 查看详情
netty框架之nio多路复用选择器(代码片段)
前言小编今天继续讲解NIO,上篇博文Netty框架之深入了解NIO核心组件中有画nio的简易模型,但是小编的代码示例中仍然是阻塞的,这是因为没有加入多路复用选择器Selector,其实只要将管道设置为非阻塞模式,... 查看详情
netty(rpc高性能之道)原理剖析
...的异步通信框架,用于创建异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性的网络客户端和服务器端RPC高性能分析,请参考文章“【总结】RPC性能之道”特点异步、非阻塞、基于事件驱动的NIO框架支持多种传输层通... 查看详情