Netty核心概念之ChannelHandler&Pipeline&ChannelHandlerContext

本文介绍了Netty中ChannelHandler、Pipeline和ChannelHandlerContext的基本概念和工作原理。Netty通过ChannelHandler处理IO事件,利用Pipeline作为责任链模式来组织Handler,而ChannelHandlerContext则提供了灵活性,允许在生命周期方法中改变数据流向。文章还探讨了ChannelInitializer在服务器启动时的角色,以及客户端连接时如何初始化Channel的pipeline。
摘要由CSDN通过智能技术生成

概述
之前学习的Reactor模型只是懂得了服务器端如何把一个连接放到workergroup中处理,那么真正处理某一个具体的请求的过程是什么样的呢

基本概念
我们知道数据的读取都是通过channel来完成的,Netty在channel的IO事件中定义了许多的生命周期函数,Netty将这些生命周期函数封装在Handler中,通过责任链的模式封装在了一个 pipeline中。当 channel中触发了对应的IO事件,就会调用pipeline中的头或者尾的一个handler,至于是否传递到下一级,由对应的handler判断.
Netty把IO事件分成两类,一个是Netty从网络中读取数据,成为InBound。一个是Netty把数据写到网络中,成为OutBound。Handler也被分成ChannelInBoundHandler和ChannelOutBoundHandler,他们各自有着不同的生命周期函数
pipeline是要给双向链表,有着头尾两个指针,inbound事件是从head节点往后传播,outbound事件是从tail节点往前传播
为了能让handler更加的灵活,Netty给handler外面包了一层的 HandlerContext. context允许handler在生命周期方法中直接改变数据的流向,比如读完数据就可以让 context在把数据写出去,那么数据的流向就从 inbound变成了outbound

在这里插入图片描述

InboundHandler
public interface ChannelInboundHandler extends ChannelHandler {
   

    # channel 注册到eventLoop
    void channelRegistered(ChannelHandlerContext ctx) throws Exception;

    # channel从eventloop中取消注册
    void channelUnregistered(ChannelHandlerContext ctx) throws Exception;

    # channel已经建立了连接
    void channelActive(ChannelHandlerContext ctx) throws Exception;

    # channel结束了连接
    void channelInactive(ChannelHandlerContext ctx) throws Exception;

    # channel从网络中读到了数据
    void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception;

    # channel读取完数据
    void channelReadComplete(ChannelHandlerContext ctx) throws Exception;
    
    # 读取数据中发生了异常调用该方法
    void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception;
}
复制代码

我们来看看-生命周期的调用源码。

channelRegistered: 在AbstractChannel方法中register方法中
private void register0(ChannelPromise promise) {
   
    try {
   
        # 这里就是让 channel注册到eventloop并且注册到selector中的方法
        doRegister();
        # 注册结束之后就会调用 pipeline的fireChannelRegistered方法
        pipeline.fireChannelRegistered();
      
        if (isActive()) {
   
            if (firstRegistration) {
   
                # 如果是激活状态还会调用 fireChannelActive 方法
                pipeline.fireChannelActive();
            } else if (config(</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CRMEB定制开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值