一、 Netty 线程模型
1 . Netty 中的线程池 : Netty 中有两组线程池 , 分别是 BossGroup 线程池 和 WorkerGroup 线程池 ;
① BossGroup 线程池 : 负责客户端的连接 ;
② WorkerGroup 线程池 : 负责客户端连接的数据读写 ;
顾名思义 , 这两个线程池中存放线程 , 这两个线程池是 NioEventLoopGroup 子类 , NioEventLoop 就是其中的线程 ;
2 . NIO 事件循环组 ( NioEventLoopGroup ) 简介 :
① NioEventLoopGroup 基类 : BossGroup 和 WorkerGroup 都是 NioEventLoopGroup 的派生类 ;
② NioEventLoopGroup 作用 : 代表 NIO 事件循环组 , 这个组中有多个事件循环 , 每个事件循环都是一个 NioEventLoop ;
3 . NIO 事件循环 ( NioEventLoop ) 简介 :
① NIO 事件循环 ( NioEventLoop ) 本质 : 表示线程 , 在该线程中循环处理任务 ;
② NIO 事件循环 ( NioEventLoop ) 作用 : 每个 NIO 事件循环 ( NioEventLoop ) 都有 Selector 监听相应的客户端请求事件 ;
4 . NIO 事件循环组 ( NioEventLoopGroup ) 与 NIO 事件循环 ( NioEventLoop ) 对应关系 : 在一个 NIO 事件循环组 ( NioEventLoopGroup ) 中可以有 多个 NIO 事件循环 ( NioEventLoop ) , 在 Netty 中这个个数可以使用代码指定 ;
5 . BossGroup 线程池中的线程 NioEventLoop 执行步骤 :
① 监听连接 : 轮询监听客户端的 accept 连接请求事件 ;
② 处理流程 : 处理该 accept 客户端连接事件 ;
建立连接 : 建立服务器与该客户端之间的连接 ;
获取通道 : 获取 套接字通道 ( SocketChannel ) ;
封装通道 : 将 SocketChannel 封装为 NioSocketChannel ;
注册通道 : 将 NioSocketChannel 注册到 WorkerGroup 线程池中的某个 NioEventLoop 中的 Selector 上 ;
③ 任务队列 : 处理任务队列中的其它任务 ;
6 . WorkerGroup 线程池中的线程 NioEventLoop 执行步骤 :
① 监听数据 : 轮询监听客户端的 读 ( Read ) 写 ( Write ) 数据事件 ;
② 处理流程 : 处理该 读 ( Read ) 写 ( Write ) 数据 IO 事件 , 基于之前注册的 NioSocketChannel 处理 IO 事件 ;
③ 任务队列 : 处理任务队列中的其它任务 ;
7 . 管道 ( Pipeline ) : 管道 ( Pipeline ) 包含 通道 ( Channel ) , 通过 管道 ( Pipeline ) 可以获取到对应的 通道 ( Channel ) , 管道 ( Pipeline ) 中维护了很多 处理器 ( Handler ) ;
8 . 下图是 Netty 的线程模型 :
二、 Netty 案例需求
需求 : 简单的功能 ;
① 服务器端 : 监听 8888 端口 , 接收到客户端消息后 , 将消息原路送回 ;
② 客户端 : 向服务器发送 “Hello World” ;