• 深入理解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//传播事件
    通过最后两次传播事件最后传播到用户方法

  • 相关阅读:
    solidity开篇:区块链基础
    机器学习:奇异值分解(SVD)详细讲解
    数据分析-numpy1
    jquery导航图片全屏滚动、首页全屏轮播图,各式相册
    双机调试环境搭建 windbg + virtualkd 已完成未发布
    Introduction to Resampling
    LLM 为什么需要 tokenizer?
    光伏电子工程的设计与实施2022——单片机力控部分实现思路
    android Handler
    Nodejs安装教程
  • 原文地址:https://blog.csdn.net/xiaocaij_icai/article/details/126276002