Netty中如何实现TimeServer
这篇文章主要介绍Netty中如何实现TimeServer,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
No1、什么是Netty
Netty是业界最流行的NIO框架之一,它的性能、健壮性、应用范围等都在同类框架中首屈一指。例如RPC框架dubbo、Hadoop的RPC框架Avro就使用Netty作为底层的通信框架。
No2、JDK中的I/O的缺点
相信大家学过Socket编程的朋友们都看到过如下的代码:
处理逻辑图如下所示
这是一个最简单的Socket程序,服务端接收到request后立即创建一个线程来处理这个request。看起来没什么毛病,但是如果并发量稍稍大一点的话,server端创建线程、销毁线程会特别消耗性能。有朋友一定会说,既然系统的瓶颈在线程的创建和销毁上,用线程池不久可以了吗?将系统创建的线程数控制在一定范围内,不会因为并发量而耗尽系统线程。确实是这样,但由于底层的通信依然采用同步阻塞模型,无法从根本上解决问题。
No3、为什么选择Netty
不选择JAVA原生NIO的原因如下:
NIO库和API复杂
代码复杂
入门困难,需要大量JAVA知识储备
JDK NIO的Bug
。。。
选择Netty的原因如下:
API简单,开发门槛低
功能强大,预置了多种编码解码功能
性能高,成熟稳定
社区活跃度高
修复了NIO中已发现的所有Bug
。。。
No4、Netty入门小Demo--TimeServer
好,下面我们就来写一个最简单的基于Netty的网络小程序,程序功能是client链接到server,server给client返回当前的时间
Step1、工程搭建
创建一个maven工程,引入相关的依赖
Step2、编写服务端--TimeServer
创建两个NioEventLoopGroup实例,NioEventLiipGroup是一个线程组,它包含了一组NIO线程。创建两个的原因是一个用于服务端接收客户端的连接,另一个用于Sockerchannel的读写。
创建ServerBootstrap,它是Netty启动服务的启动类,将EventLoop Group传入ServerBootstrap中,最后绑定I/O事件的处理类ChildChannelHandler。
bind端口,调用同步阻塞方法sync等待绑定操作完成,并返回一个ChannelFuture对象,它的功能类似于java.util.concurrent.Future,主要用于异步回调。
等待服务器端链路关闭后main方法结束
I/O事件处理类ChildChannelHandler.java的实现
将msg转化为ByteBuf对象,此对象相当于byte[],不过比byte[]封装了更多操作。
ByteBuf的readableBytes()方法可以获取缓冲区中可读到的字节数,并将它写入byte[]中
创建响应,并写给客户端。
这就是server端的代码,很简单吧
Step3、编写客户端--TimeClient
创建EventLoopGroup实例
创建Bootstrap实例,与TimeServer不同的是,此处Channel需要设置为NioSockerChannel
调用connect发起异步连接,然后调用sync等待连接成功
关闭连接,释放资源
TimeClientHandler.java的实现
当client与server的TCP连接成功后,Netty的NIO线程调用channelActive方法,向服务器发送请求
将byte[]数据封装到ByteBuf中,并发送请求
将响应msg转化为ByteBuf对象,写入byte[]中
打印响应数据
以上是"Netty中如何实现TimeServer"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!