• 深入理解netty(二)Channel


    上一篇文章介绍过channel,channel里面主要是封装了对于客户端连接的建立等的一些api,以及socket等,对于封装的api可以进行一些读写
    先留两个问题:
    1.服务端的socket在哪里初始化?
    2.在哪里accept链接?

    关于创建channel主要分为以下几个步骤
    创建channel
    初始化channel
    注册selector

    其中创建channel的时候调用链路主要为
    bind()-》dobind()-〉initandRegister-》new channel
    其中initAndRegister内部有一个channelFactory.newChannel这个通过工厂模式来生成chennel的代码
    在这里插入图片描述
    进来之后可以发现他是通过clazz来实现,即通过反射来实现
    在这里插入图片描述
    反射创建服务端channel:
    newSocket()
    NioServerSocketChannelConfig()
    然后执行父类的构造函数
    AbstractNioChannel()
    这里面会执行
    configBlocking(false)
    以及AbstractChannel(id,unsafe,pipeline)
    客户端和服务端端channel都会继承abstractchannel这个抽象类
    其中id是唯一标识,unsafe是底层关于tcp底层的读写的一些操作,
    pipeline是后面要讲过的非常重要的组件(其实上一章也提过)

    好了,创建channel的步骤基本讲完了,后面要说一下他是如何进行初始化的
    init()
    setChannelOps setChannelAttrs
    setChildOps setChildsAttrs//把用户自定义的两个参数保存起来
    configHandler//其实就是把用户输入的handler给他拿到,然后通过pipeline.addLast的方式这样一个逻辑链处理列给他封装进去
    addServerBootstrapAcceptor

    最后就是注册selector的过程
    主要流程如下:
    AbstractChannel.register这一个入口进入
    this.eventLoop=eventLoop//绑定eventloop
    register0()
    .doregister()//调用jdk底层注册
    pipeline.invokerHandlerAddIfNeeded//传播事件
    pipeline.fireChannelRegistered//传播事件
    通过最后两次传播事件最后传播到用户方法

  • 相关阅读:
    【STM32】
    Python3操作redis百万级数据迁移,单机到单机,集群到集群
    react Hooks怎么用
    万维网:蒂姆·伯纳斯·李的信息帝国
    ubuntu 22.04 安装 minikube 和 istio
    Spring 项目全局日志最佳实践
    分布式存储之hash取余算法
    【UVM 验证平台打印时间单位控制】
    【CAD建模号】V4.3更新:保存新功能
    NLP(20)--知识图谱+实体抽取
  • 原文地址:https://blog.csdn.net/xiaocaij_icai/article/details/126276002