实际开发过程中 , 在拿到channel之后,做一个判断,看是什么连接,如(channel instanceof SocketChannel/DatagramChannel)
,就可以做不同的业务处理 。
SelectorNetty基于Selector对象实现I/O多路复用,通过Selector一个线程可以监听多个连接的Channel事件
。当向一个Selector中注册Channel后 , Selector内部的机制就可以自动不断地查询(Select)这些注册的Channel是否有已就绪的I/O事件(例如可读,可写,网络连接完成等),这样程序就可以很简单地使用一个线程高效地管理多个Channel 。
ChannelHandler 及其实现类ChannelHandler是一个接口 , 处理 I/O 事件或拦截 I/O 操作,并将其转发到其 ChannelPipeline(业务处理链)中的下一个处理程序
。
ChannelHandler
及其实现类一览图:

文章插图
【Netty学习记录-入门篇】- ChannelInboundHandler 用于处理入站 I/O 事件 。- ChannelOutboundHandler 用于处理出站 I/O 操作 。- ChannelInboundHandlerAdapter 用于处理入站 I/O 事件 。- ChannelOutboundHandlerAdapter 用于处理出站 I/O 操作 。- ChannelDuplexHandler 用于处理入站和出站事件 。Pipeline 和 ChannelPipeline
ChannelPipeline
是一个 Handler 的集合,它负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于一个贯穿 Netty 的链
。(也可以这样理解:ChannelPipeline
是 保存 ChannelHandler
的 List,用于处理或拦截 Channel 的入站事件和出站操作) 。ChannelPipeline
实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel 中各个的 ChannelHandler
如何相互交互 。在 Netty 中每个 Channel 都有且仅有一个
ChannelPipeline
与之对应 , 它们的组成关系如下:
文章插图
一个 Channel 包含了一个
ChannelPipeline
,而 ChannelPipeline
中又维护了一个由 ChannelHandlerContext
组成的双向链表,并且每个ChannelHandlerContext
中又关联着一个 ChannelHandler
。入站事件和出站事件在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最前一个出站的 handler,两种类型的 handler 互不干扰 。
常用方法:
- ChannelPipeline addFirst(ChannelHandler... handlers) , 把一个业务处理类(handler)添加到链中的第一个位置 。- ChannelPipeline addLast(ChannelHandler... handlers),把一个业务处理类(handler)添加到链中的最后一个位置 。ChannelHandlerContext
保存Channel相关的所有上下文信息,同时关联一个ChannelHandler对象
。ChannelHandlerContext
中包含一个具体的事件处理器ChannelHandler
,同时ChannelHandlerContext
中也绑定了对应的pipeline和Channel的信息,方便对ChannelHandler
进行调用 。常用方法:
- ChannelFuture close(): 关闭通道- ChannelOutboundInvoker flush(): 刷新- ChannelFuture writeAndFlush(Object msg): 将数据写到ChannelPipeline中当前ChannelHandler的下一个ChannelHandler开始处理 。ChannelOption
ChannelOption.SO_BACKLOG
- 对应TCP/IP协议listen函数中的backlog参数 , 用来初始化服务器可连接队列大小 。服务端处理客户端连接请求时顺序处理的,所以同一时间只能处理一个客户端连接 。多个客户端来的时候,服务器将不能处理的客户端连接请求放在队列中等待处理,backlog参数指定了队列的大小 。
- 对应TCP/IP协议listen函数中的backlog参数 , 用来初始化服务器可连接队列大小 。服务端处理客户端连接请求时顺序处理的,所以同一时间只能处理一个客户端连接 。多个客户端来的时候,服务器将不能处理的客户端连接请求放在队列中等待处理,backlog参数指定了队列的大小 。
ChannelOption.SO_KEEPALIVE
- 一直保持连接活动状态 。
- 一直保持连接活动状态 。

文章插图
BoosEventLoopGroup
通常是一个单线程的EventLoop
,EventLoop
维护着一个注册了ServerSocketChannel
的Selector实例 ,BossEventLoop
不断轮询将连接事件分离出来 。
- 通常是OP_ACCEPT事件,然后将接收到的
SocketChannel
交给WorkerEventLoopGroup
。
WorkerEventLoopGroup
会由next选择其中一个EventLoop
来将这个SocketChannel
注册到其维护的Selector并对其后续的IO事件进行处理 。
推荐阅读
- HDFS基础学习
- 【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?
- 记录一次sshd服务启动失败
- 零基础如何学游戏编程(游戏编程学习入门)
- 机器学习实战-AdaBoost
- Pytorch模型量化
- 三 【单片机入门】应用层软件开发的单片机学习之路-----UART串口通讯和c#交互
- 二 【SSM】学习笔记——SpringMVC入门
- Briefings in Bioinformatics-2021 知识图谱-生物信息学-医学顶刊论文:生物信息学中的图表示学习:趋势、方法和应用
- 微信我的收藏怎么删除(公安局能调取已删微信记录吗)