实际开发过程中 , 在拿到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
及其实现类一览图:

文章插图
- 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参数指定了队列的大小 。
经验总结扩展阅读
- 高三物理学习方法技巧是什么 有哪些窍门
- 给朋友的腊八节祝福语
- 腊八节经典祝福文案15篇
- 腊八节祝福语集合
- 腊八节最暖心祝福语2023
- 国庆节姐姐祝福语2023
- 国庆节祝福姐姐的祝福语
- 银行国庆节短信祝福
- 2023国庆节祝福语
- 2023祝朋友七夕快乐的祝福语
- 对应TCP/IP协议listen函数中的backlog参数 , 用来初始化服务器可连接队列大小 。服务端处理客户端连接请求时顺序处理的 , 所以同一时间只能处理一个客户端连接 。多个客户端来的时候 , 服务器将不能处理的客户端连接请求放在队列中等待处理 , backlog参数指定了队列的大小 。