欢迎访问shiker.tech

请允许在我们的网站上展示广告

您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。

Netty管道处理器做了什么
(last modified Aug 13, 2023, 7:18 PM )
by
侧边栏壁纸
  • 累计撰写 186 篇文章
  • 累计创建 65 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Netty管道处理器做了什么

橙序员
2023-08-13 / 0 评论 / 0 点赞 / 392 阅读 / 701 字 / 正在检测百度是否收录... 正在检测必应是否收录...
文章摘要(AI生成)

netty中的管道处理器是用于网络通信中的数据的初始化、处理器的注册以及通道数据的读写。默认的管道实现是DefaultChannelPipeline,它是一个处理器双向链表,包含头节点和尾节点处理器。当我们调用管道的addLast方法添加处理器时,会向链表中添加一个DefaultChannelHandlerContext,其中包含了上下节点和ChannelHandler。ChannelHandler负责消息的传递和写入,通道入道处理器读取对方发送的消息内容,通道出道处理器将消息写入通道。在服务端通道注册时,默认状态为接收就绪,而客户端通道注册时,默认状态为读就绪。总的来说,netty的管道处理器是用于网络通信中初始化、处理器注册和数据读写的机制。

管道处理器

netty中,网络通道的初始化和处理器注册、通道数据的读写都是管道完成的。默认的管道实现是DefaultChannelPipeline,它主要是一个处理器双向链表,默认包含头节点处理和尾节点处理器:

    final AbstractChannelHandlerContext head;
    final AbstractChannelHandlerContext tail;
    
    protected DefaultChannelPipeline(Channel channel) {
        // channel不能为空,否则抛出异常
        this.channel = ObjectUtil.checkNotNull(channel, "channel");
        succeededFuture = new SucceededChannelFuture(channel, null);
        voidPromise =  new VoidChannelPromise(channel, true);

        tail = new TailContext(this);
        head = new HeadContext(this);

        head.next = tail;
        tail.prev = head;
    }

AbstractChannelHandlerContext的类关系图如下,当我们调用管道的addLast方法添加处理器时,他会向链表中添加一个DefaultChannelHandlerContext, 而DefaultChannelHandlerContext中除了上下节点元素之外,其元素值即是我们的ChannelHandler.

image-20230813183930354

ChannelHandler的实现如下:

image-20230813184253389

其分别包含了负责消息逐级传递的通道入道处理器和负责消息实际写入的通道出道处理器。通道入道处理器负责读取对方发送过来的消息内容(例如通道注册、读取请求等),而通道储到管理器则是有我们将消息写入到通道中(例如端口绑定、连接发送和接收等)

服务端通道注册

当服务端管道注册时,创建后的服务端管道默认状态位为接收就绪

netty-服务端创建.drawio

客户端通道注册

当客户端通道注册时,创建后的客户端端通道默认状态位为读就绪

当客户端通道连接服务端,

​ 连接完成时,则将客户端通道的状态位更新为读就绪

​ 处于连接中时,则将客户端通道的状态位更新为连接就绪,等待轮询时重试

netty-客户端创建.drawio

服务端接收连接

事件循环中的轮询监听到服务端通道有连接请求时,调用管道处理器中我们在服务端启动器中向其添加的ServerBootstrapAcceptor管道处理器进行连接的接收,他会为我们的连接在服务端创建相应的客户端通道,在客户端通道初始化时会将我们自定义的编解码处理器添加到管道中。

netty-服务端接收连接.drawio

数据读写

事件循环中的轮询监听到客户端通道有访问请求时,调用管道处理器中我们在自定义的管道处理器进行请求数据的处理,如果我们在自定义的管道处理器中向通道内写入数据,那么通道的状态会更新为写就绪,这时轮询会进听到写就绪因而进行缓存的刷新。

netty-读写数据.drawio

0

评论区