Netty中如何实现TimeServer

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

  1. 创建两个NioEventLoopGroup实例,NioEventLiipGroup是一个线程组,它包含了一组NIO线程。创建两个的原因是一个用于服务端接收客户端的连接,另一个用于Sockerchannel的读写。

  2. 创建ServerBootstrap,它是Netty启动服务的启动类,将EventLoop Group传入ServerBootstrap中,最后绑定I/O事件的处理类ChildChannelHandler。

  3. bind端口,调用同步阻塞方法sync等待绑定操作完成,并返回一个ChannelFuture对象,它的功能类似于java.util.concurrent.Future,主要用于异步回调。

  4. 等待服务器端链路关闭后main方法结束



I/O事件处理类ChildChannelHandler.java的实现

  1. 将msg转化为ByteBuf对象,此对象相当于byte[],不过比byte[]封装了更多操作。

  2. ByteBuf的readableBytes()方法可以获取缓冲区中可读到的字节数,并将它写入byte[]中

  3. 创建响应,并写给客户端。

这就是server端的代码,很简单吧

Step3、编写客户端——TimeClient

  1. 创建EventLoopGroup实例

  2. 创建Bootstrap实例,与TimeServer不同的是,此处Channel需要设置为NioSockerChannel

  3. 调用connect发起异步连接,然后调用sync等待连接成功

  4. 关闭连接,释放资源

TimeClientHandler.java的实现

  1. 当client与server的TCP连接成功后,Netty的NIO线程调用channelActive方法,向服务器发送请求

  2. 将byte[]数据封装到ByteBuf中,并发送请求

  3. 将响应msg转化为ByteBuf对象,写入byte[]中

  4. 打印响应数据

以上是“Netty中如何实现TimeServer”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-12-28 22:17:44
收藏
分享
海报
0 条评论
30
上一篇:如何使用netty开发 下一篇:如何从时延毛刺问题定位到Netty的性能统计设计
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码