# netty-demo **Repository Path**: zhong-kai-demo/netty-demo ## Basic Information - **Project Name**: netty-demo - **Description**: netty学习 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-12 - **Last Updated**: 2022-03-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # netty-demo #### 介绍 - BIO NOI 介绍 - BIO 一个连接一个线程,当连接过多时会产生大量线程,并且每个连接并不是每时每刻都在读写数据。 - ![img.png](img.png) - NIO 线程通过一个选择器Selector轮训来选择有事件发生的连接进行处理,事件驱动,多路复用。 - ![img_2.png](img_2.png) - netty学习 - 传统NIO对网络API的熟练度要求很高,所以有了Netty框架屏蔽NIO的复杂的API - NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 - 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 - 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 - JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU100%。直到 JDK1.7 版本该问题仍旧存在,没有被根本解决。 - netty工作原理 - ![](img/netty工作原理.png) - 1. Netty 抽象出两组线程池 ,BossGroup 专门负责接收客户端的连接,WorkerGroup 专门负责网络的读写 - 2. BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup - 3. NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环,每一个事件循环是 NioEventLoop - 4. NioEventLoop 表示一个不断循环的执行处理任务的线程,每个 NioEventLoop 都有一个 Selector,用于监听绑定在其上的 socket 的网络通讯 - 5. NioEventLoopGroup 可以有多个线程,即可以含有多个 NioEventLoop - 6. 每个 BossGroup下面的NioEventLoop 循环执行的步骤有 3 步 - 7. 轮询 accept 事件 - 处理 accept 事件,与 client 建立连接,生成 NioScocketChannel,并将其注册到某个 workerGroup NIOEventLoop 上的 Selector - 继续处理任务队列的任务,即 runAllTasks - 8. 每个 WorkerGroup NIOEventLoop 循环执行的步骤 - 轮询 read,write 事件 - 处理 I/O 事件,即 read,write 事件,在对应 NioScocketChannel 处理 - 处理任务队列的任务,即 runAllTasks - 9. 每个 Worker NIOEventLoop 处理业务时,会使用 pipeline(管道),pipeline 中包含了 channel(通道),即通过 pipeline 可以获取到对应通道,管道中维护了很多的处理器。 #### 项目说明 - 使用netty做了tcp,simple使用,聊天室,企业项目使用的相关代码 #### 使用说明 1. netty学习笔记 https://blog.csdn.net/Youth_lql/article/details/115734142