![跟闪电侠学Netty:Netty即时聊天实战与底层原理](https://wfqqreader-1252317822.image.myqcloud.com/cover/384/43738384/b_43738384.jpg)
2.3 Netty编程
Netty到底是何方神圣?
用一句简单的话来说就是:Netty封装了JDK的NIO,让你用得更方便,不用再写一大堆复杂的代码了。
用官方正式的话来说就是:Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务端和客户端。
下面是笔者总结的使用Netty而不使用JDK原生NIO的原因。
1.使用JDK原生NIO需要了解太多概念,编程复杂,一不小心就Bug横飞。
2.Netty底层IO模型随意切换,而这一切只需要做微小的改动,改改参数,Netty可以直接从NIO模型变身为IO模型。
3.Netty自带的拆包/粘包、异常检测等机制让你从NIO的繁重细节中脱离出来,只需要关心业务逻辑即可。
4.Netty解决了JDK很多包括空轮询在内的Bug。
5.Netty底层对线程、Selector做了很多细小的优化,精心设计的Reactor线程模型可以做到非常高效的并发处理。
6.自带各种协议栈,让你处理任何一种通用协议都几乎不用亲自动手。
7.Netty社区活跃,遇到问题随时邮件列表或者Issue。
8.Netty已经历各大RPC框架、消息中间件、分布式通信中间件线上的广泛验证,健壮性无比强大。
这些原因看不懂没有关系,在后续的章节中我们都可以学到。接下来我们用Netty来重新实现一下本章开篇的功能吧!
首先引入Maven依赖,本书后续Netty都基于4.1.6.Final版本。
![](https://epubservercos.yuewen.com/6C3355/23020652909769306/epubprivate/OEBPS/Images/txt003_7.jpg?sign=1739004086-tMk5x9NYFAusMdVqghZ6YzfJg7svRGHt-0-425803008ec1a3b963a437ee026c5aff)
然后是服务端实现部分。
NettyServer.java
![](https://epubservercos.yuewen.com/6C3355/23020652909769306/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1739004086-5Dz4isV7YWFVWEXEreDtIXfdUKHIOUeG-0-3d49f6e100665fa3aa900ac4da80f96d)
这么一小段代码就实现了我们前面NIO编程中的所有功能,包括服务端启动、接收新连接、打印客户端传来的数据,怎么样?是不是比JDK原生NIO编程简洁许多?
初学Netty的时候,由于大部分人对NIO编程缺乏经验,因此,将Netty里的概念与IO模型结合起来可能更好理解。
1.boss对应IOServer.java中的负责接收新连接的线程,主要负责创建新连接。
2.worker对应IOServer.java中的负责读取数据的线程,主要用于读取数据及业务逻辑处理。
剩下的逻辑笔者在后面的内容中会详细分析,读者可以先把这段代码复制到自己的IDE里,然后运行main函数。
下面是客户端NIO的实现部分。
NettyClient.java
![](https://epubservercos.yuewen.com/6C3355/23020652909769306/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1739004086-QmOZynm1krkJIxvTTue6cVQuqW3z2sIr-0-708b6d7d92f209cfc5a52d9956412750)
在客户端程序中,group对应了IOClient.java中main函数起的线程,剩下的逻辑在后面的内容中会详细分析,现在你要做的事情就是把这段代码复制到你的IDE里,然后运行main函数,最后回到NettyServer.java的控制台,你会看到效果。
使用Netty之后是不是觉得整个世界都变美好了?一方面,Netty对NIO封装得如此完美,写出来的代码非常优雅;另一方面,使用Netty之后,网络通信的性能问题几乎不用操心,尽情地让Netty“榨干”你的CPU吧。