一、ChannelHandlerContext
1)、保存 Channel 相关的所有上下文信息,同时关联一个 ChannelHandler 对象
2)、ChannelHandlerContext 中包含一个具体的事件处理器 ChannelHandler,同时 ChannelHandlerContext 中也绑定了对应的 Pipeline 和 Channel 的信息,方便对 ChannelHandler 进行调用
3)、常用方法:
- ChannelFuture close():关闭通道
- ChannelHandlerContext flush():刷新
- ChannelFuture writeAndFlush(Object msg):将数据写到 ChannelPipeline 中当前 ChannelHandler 的下一个 ChannelHandler 开始处理(出站)
二、ChannelOption
1)、Netty 在创建 Channel 实例后,一般都需要设置 ChannelOption 参数。
2)、ChannelOption 参数如下:
- ChannelOption.SO_BACKLOG:对应TCP/IP协议 listen 函数中的 backlog 参数,用来初始化服务器可连接队列大小。服务器处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接。多个客户端来的时候,服务器将不能处理的客户端连接请求放在队列中等待处理,backlog 参数指定了队列的大小。
- ChannelOption.SO_KEEPALIVE:一直保持连接活动状态
三、EventLoopGroup
1)、EventLoopGroup 是一组 EventLoop 的抽象,Netty 为了更好的利用多核 CPU 资源,一般会有多个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例。
2)、EventLoopGroup 提供 next 接口,可以从组里面按照一定规则获取其中一个 EventLoop 来处理任务。在 Netty 服务器编程中,一般都需要提供两个 EventLoopGroup ,例如:BossEventLoopGroup 和 WorkerEventLoopGroup。
3)、通常一个服务器端口即一个 ServerSocketChannel 对应一个 Selector 和一个 EventLoop 线程。BossEventLoop 负责接收客户端的连接并将 SocketChannel 交给 WorkerEventLoopGroup 来进行 IO 处理。如下图所示:
- BossEventLoopGroup 通常是一个单线程的 EventLoop,EventLoop 维护着一个注册了 ServerSocketChannel 的 Selector 实例,BossEventLoop 不断轮询 Selector 将连接事件分离出来
- 通常是 OP_ACCEPT 事件,然后将接收到的 SocketChannel 交给 WorkerEventLoopGroup
- WorkerEventLoopGroup 会由 next 选择其中一个 EventLoop 来将这个 SocketChannel 注册到其维护的 Selector 并对其后续的IO事件进行处理
4)、常用方法:
- public NioEventLoopGroup():构造方法
- Future<?> shutdownGracefully():断开连接,关闭线程