netty 服务端创建的流程
1. ServerBootstrap NIO 服务端启动辅助类,设置各种必要的参数 使用builder模式,解决构造函数参数过多并且不确定问题
2. EventLoopGroup selector 线程池
系统中有两个Reactor线程组
- 服务端用于监听和接收客户端连接的Reactor线程组
- 处理I/O读写的Reactor线程组
- 绑定NioServerSocketChannel 服务端channel
- 设置TCP连接参数
backlog 表示的是未连接队列(当前连接服务器处于SYN_RECV状态)和 已完成连接队列(ESTABLISHED状态) 两个队列总和的最大值 - TCP 链路建立时创建ChannelPipeline()
- 添加并设置ChannelHandler()
启动辅助类和父类分别指定handler,父类的handler作用是工厂类,为每一个客户端创建一个handler
辅助类的作用是所有监听端口的客户端都会执行它。
- 绑定并启动监听端口
- initAndRegister 创建,初始化和NioServerSocketChannel
- 将其注册到Reactor上, 注册方式使用promise,启动异步线程进行注册。
- Selector轮询。 由Reactor线程NioEventLoop负责调度和执行Selector轮询操作,选择准备就绪的Channel集合.
- 执行ChannelPipeline的相应的方法, 最终调度并执行ChannelHandler。
- 执行用户自定义的ChannelHandler
netty 客户端创建的流程
1. Bootstrap实例
2. 创建处理客户端连接、I/O读写的Reactor线程NioEventLoopGroup
3. 创建NioSocketChannel
4. 创建默认的Channel Handler Pipeline, 用于调度和执行网路事件
5. 发起TCP连接, 判断连接是否成功。如果成功,将NioSocketChannel注册到多路复用上,监听读操作位
6. 注册对应的网络监听状态位到多路复用器
7. 多路复用器在I/O现场中轮询各Channel, 处理连接结果。
8. 如果连接成功,设置Future结果, 发送连接成功事件, 触发ChannelPipeline执行
9. 由ChannelPipeline 调度执行系统和用户的ChannelHandler, 执行业务逻辑。
处理超时,在创建NIOSocketChannel的时候,注册一个超时的定时器,如果定时器执行了,说明超时了,关闭链路,再做后续的操作。
如果在定时器执行之前返回了,就删除了定时器