博客
关于我
Netty源码—5.Pipeline和Handler二
阅读量:801 次
发布时间:2023-02-15

本文共 2360 字,大约阅读时间需要 7 分钟。

ChannelPipeline和ChannelHandler的核心知识

Netty作为一个高性能的异步I/O框架,其最大的特征之一就是ChannelHandler是可插拔的,可以动态编织ChannelPipeline。ChannelPipeline和ChannelHandler的配合使得Netty能够实现高效的网络通信和事件处理。在实际应用中,ChannelHandler可以根据业务需求灵活配置和删除,例如权限认证、流量控制等场景。

Pipeline和Handler的作用和构成

ChannelPipeline是Netty处理网络通信的核心逻辑框架,负责将读写事件按照预定义的顺序传播给用户定义的ChannelHandler。ChannelHandler则是Netty应用程序的灵魂,负责处理I/O事件、异常、连接状态变化等。

ChannelPipeline内部采用双向链表结构,每个节点是一个AbstractChannelHandlerContext对象。每个节点保存着一个用户自定义的ChannelHandler。ChannelHandlerContext中包含了ChannelPipeline和Channel的所有上下文信息。通过ChannelPipeline的链表结构,开发者可以动态添加和删除ChannelHandler。

ChannelHandler的分类

在Netty中,ChannelHandler可以分为以下几类:

  • InboundHandler:负责处理读取事件(Inbound事件),包括数据读取、连接活跃激活、连接不活跃等。
  • OutboundHandler:负责处理写入事件(Outbound事件),包括数据写入、连接关闭等。
  • ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter:Netty提供的默认实现,负责将事件传递给下一个ChannelHandler。
  • 自定义Handler:用户可以根据需求继承自上述基础类或直接实现ChannelHandler接口。
  • 特殊的ChannelHandler实现

    以AuthHandler为例,它用于对第一个传来的数据包进行权限认证。如果认证通过,AuthHandler会主动删除自己,这样后续的数据包就不会再进行认证校验了。

    public class AuthHandler extends SimpleChannelInboundHandler {    @Override    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf data) throws Exception {        if (verify(data)) {            ctx.pipeline().remove(this);        } else {            ctx.close();        }    }}

    ChannelHandler的生命周期

    ChannelHandler从注册到释放的整个过程可以分为以下几个阶段:

  • 注册:通过pipeline().register()方法将ChannelHandler添加到ChannelPipeline链表中。
  • 激活:当连接活跃时,触发channelActive()方法。
  • 读取:当有数据可读时,触发channelRead()方法。
  • 写入:当有数据需要发送时,触发channelWrite()方法。
  • 异常处理:在I/O操作过程中出现异常时,触发exceptionCaught()方法。
  • 关闭:当连接关闭时,触发channelUnregistered()方法。
  • 资源释放:通过handlerRemoved()方法释放资源。
  • ChannelPipeline的事件传播

    ChannelPipeline的事件传播机制分为Inbound事件、Outbound事件和异常事件三种类型。

    Inbound事件传播

    Inbound事件的传播从HeadContext结点开始,依次调用每个InboundHandler的相应方法。事件传播的终点是TailContext结点。默认情况下,Inbound事件会从HeadContext传播到TailContext。

    Outbound事件传播

    Outbound事件的传播从TailContext结点开始,依次调用每个OutboundHandler的相应方法。事件传播的终点是HeadContext结点。Outbound事件的处理通常用于数据的写入和发送。

    异常事件传播

    在I/O操作过程中发生异常时,ChannelPipeline会通知所有Handler的exceptionCaught()方法。异常事件从当前结点开始,依次传播到下一个结点,直到TailContext结点处理完毕。

    ChannelPipeline的总结

    ChannelPipeline的核心结构包括:

  • 初始化:由AbstractChannel创建,默认添加HeadContext和TailContext结点。
  • 数据结构:采用双向链表结构,支持动态添加和删除ChannelHandler。
  • 事件传播:Inbound事件从HeadContext到TailContext传播,Outbound事件从TailContext到HeadContext传播。
  • 异常处理:异常事件从当前结点开始,依次传播到下一个结点,直到TailContext处理完毕。
  • 通过灵活配置和管理ChannelHandler,开发者可以根据需求定制Netty的行为,实现高效的网络通信和业务逻辑处理。

    转载地址:http://ivcfk.baihongyu.com/

    你可能感兴趣的文章
    object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    查看>>
    object detection错误之no module named nets
    查看>>
    Object of type 'ndarray' is not JSON serializable
    查看>>
    Object Oriented Programming in JavaScript
    查看>>
    object references an unsaved transient instance - save the transient instance before flushing
    查看>>
    Object 类的常见方法有哪些?
    查看>>
    Object-c动态特性
    查看>>
    Object.assign用法
    查看>>
    Object.create
    查看>>
    Object.defineProperty详解
    查看>>
    Object.keys()的详解和用法
    查看>>
    objectForKey与valueForKey在NSDictionary中的差异
    查看>>
    Objective - C 小谈:消息机制的原理与使用
    查看>>
    OBJECTIVE C (XCODE) 绘图功能简介(转载)
    查看>>
    Objective-C ---JSON 解析 和 KVC
    查看>>
    Objective-C 编码规范
    查看>>
    Objective-Cfor循环实现Factorial阶乘算法 (附完整源码)
    查看>>
    Objective-C——判断对象等同性
    查看>>
    objective-c中的内存管理
    查看>>
    Objective-C之成魔之路【7-类、对象和方法】
    查看>>