菜鸡学习netty源码(一)——ServerBootStrap启动

news2024/12/22 22:48:19

1.概述

对于初学者而然,写一个netty本地进行测试的Server端和Client端,我们最先接触到的类就是ServerBootstrap和Bootstrap。这两个类都有一个公共的父类就是AbstractBootstrap.

那既然 ServerBootstrap和Bootstrap都有一个公共的分类,那就证明它们两个肯定有很多公共的职责和方法。

AbstractBootStrap

我们先进行来看AbstractBootStrap这个类

构造函数

public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable {

    volatile EventLoopGroup group;
    @SuppressWarnings("deprecation")
    private volatile ChannelFactory<? extends C> channelFactory;
    private volatile SocketAddress localAddress;
    private final Map<ChannelOption<?>, Object> options = new LinkedHashMap<ChannelOption<?>, Object>();
    private final Map<AttributeKey<?>, Object> attrs = new LinkedHashMap<AttributeKey<?>, Object>();
    private volatile ChannelHandler handler;

    AbstractBootstrap() {
        // Disallow extending from a different package.
    }

    AbstractBootstrap(AbstractBootstrap<B, C> bootstrap) {
        group = bootstrap.group;
        channelFactory = bootstrap.channelFactory;
        handler = bootstrap.handler;
        localAddress = bootstrap.localAddress;
        synchronized (bootstrap.options) {
            options.putAll(bootstrap.options);
        }
        synchronized (bootstrap.attrs) {
            attrs.putAll(bootstrap.attrs);
        }
    }

............. //省略别的代码
}

从上面的代码 我们可以看出来几点:

1.AbstractBootStrap这个抽象类定义B,C两个泛型,B泛型继承了AbstractBootStrap这个类,C泛型继承于Channel这个类

2.提供了两个构造函数,一个是无参的 一个是有参的,有参的构造函数中,有两行synchronized 进行修饰的代码,是options和attrs属性可能会有并发问题吗?

3.实现了Cloneable接口,这个Cloneable接口在java中表示这个类是否可以被克隆,我对此有这个疑问,为啥要实现这个接口呢 

看完AbstractBootStrap的这个构造函数,我们一起看下ServerBootstrap和Bootstrap在我们写的demo中都涉及到一些方法,

group方法

   public B group(EventLoopGroup group) {
        ObjectUtil.checkNotNull(group, "group");
        if (this.group != null) {
            throw new IllegalStateException("group set already");
        }
        this.group = group;
        return self();
    }

 这个group方法看上去就是一个简单的属性赋值的操作,并没有什么特别之处,跟咱们普通的set方法的区别在于最后调用了self方法,但是我们看下self方法之后,就是返回了一个自身的对象。

    private B self() {
        return (B) this;
    }

channel方法

    public B channel(Class<? extends C> channelClass) {
        return channelFactory(new ReflectiveChannelFactory<C>(
                ObjectUtil.checkNotNull(channelClass, "channelClass")
        ));
    }

这块就跟group方法不一样了,看上去不再是简单的属性赋值了,我们点击到channelFactory方法中进行查看。心想着总该不一样了,但是点击进去还是属性赋值的操作,但是这次属性赋值有点区别了,是根据传入的channelClass的Class对象 构建了一个ReflectiveChannelFactory对象

  public B channelFactory(io.netty.channel.ChannelFactory<? extends C> channelFactory) {
        return channelFactory((ChannelFactory<C>) channelFactory);
    }

    public B channelFactory(ChannelFactory<? extends C> channelFactory) {
        ObjectUtil.checkNotNull(channelFactory, "channelFactory");
        if (this.channelFactory != null) {
            thr

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1639264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977.有序数组的平方 题目链接https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 题解&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* sortedSquares(int* nums, int numsSize, int* returnSize) {/…

【Vue中的Ajax配置代理slot插槽】

Vue脚手架配置代理 安装命令 npm install axios vue.config.js 是一个可选的配置文件 如果项目的(和package . json同级的)根目录中存在这个文件&#xff0c; 那么它会被vue/cli-service自动加载 你也可以使用package.json中的 [vue字段&#xff0c;但是注意这种写法需要你严格…

Vue入门篇:样式冲突scoped,data函数,组件通信,prop data单向数据流,打包发布

这里写目录标题 1.组件的样式冲突scoped2.data函数3.组件通信1.两种组件关系分类和对应的组件通信方案2.父子通信方案的核心流程 4.prop & data、单向数据流5.打包发布6.打包优化:路由懒加载 1.组件的样式冲突scoped 默认情况:写在组件中的样式会全局生效→因此很容易造成多…

axios.get请求 重复键问题??

封装的接口方法&#xff1a; 数据&#xff1a; 多选框多选后 能得到对应的数组 但是请求的载荷却是这样的,导致会请求不到数据 departmentChecks 的格式看起来是一个数组&#xff0c;但是通常 HTTP 请求的查询参数不支持使用相同的键&#xff08;key&#xff09;名多次。如…

数据结构-链表OJ

1.删除链表中等于给定值 val 的所有结点。 . - 力扣&#xff08;LeetCode&#xff09; 思路一&#xff1a;遍历原链表&#xff0c;将值为val的节点释放掉 思路二&#xff1a;创建一个新链表&#xff0c;将值不为val的节点尾插到新链表中 /*** Definition for singly-linked …

Stable Diffusion WebUI 中调度器(Schedule type)简单研究

&#x1f48e;内容概要 在近期&#xff0c;stable diffusion webui更新了1.9版本&#xff0c;其中包含的一项变化就是&#xff0c;把采样器和调度器&#xff08;Schedule type&#xff09;分开了&#xff0c;之前是合并在一起来选择的&#xff0c;所以这篇文章主要分两个部分&…

用Langchain创建一个可以总结网页内容的Agent

去年的时候我写过一篇关于OpenAi Function Call的实践文章&#xff0c;就是用Function Call的功能实现抓取并总结网页内容的功能&#xff0c;具体可以参考ChatGPT函数调用初体验&#xff1a;让ChatGPT具备抓取网页文本的能力&#xff0c;当时写了还算比较多的代码&#xff0c;最…

查询每个部门工资最高的员工 sql

在线运行sql语句 CREATE TABLE dept (dno INT PRIMARY KEY AUTO_INCREMENT,dname VARCHAR(50) NOT NULL,dlocal VARCHAR(100) ); CREATE TABLE employee (eno INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(50) NOT NULL,egender CHAR(2),deptno INT NOT NULL,ejob VARCHAR(5…

动态规划-两个数组的dp问题1

文章目录 1. 最长公共子序列&#xff08;1143&#xff09;2. 不相交的线&#xff08;1035&#xff09; 1. 最长公共子序列&#xff08;1143&#xff09; 题目描述&#xff1a; 状态表示&#xff1a; 建立一个二维的数组dp&#xff0c;dp[i][j]表示在第一个字符串的0到i区间以…

如何定时打开网站

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具按下Ctrl3&#xff0c;切换到定时器模块&#xff0c;左侧右键&#xff0c;选择新建 2、标题叫百度&#xff0c;等下就让它打开百度&#xff0c…

在Windows系统cmd中输入python无法启动想要的版本 | cmd输入python反而启动Microsoft Store

在Windows系统cmd中输入python无法启动想要的版本 | cmd输入python反而启动Microsoft Store 情况一&#xff1a;无法启动目标python版本&#xff0c;明明已经添加了环境变量 根源&#xff1a;环境变量Path中有多个版本的python路径&#xff0c;想启动的python对应的环境变量排…

STM32F407实现傅里叶变换的三种方法【附源码】

一、浅谈傅里叶变换&#xff08;Fourier Transformation&#xff0c;FT&#xff09; 1、傅里叶级数 想要了解傅里叶变换&#xff0c;就要先了解一下什么是傅里叶级数。 如图所示&#xff0c;通过不断合成不同频率的正弦波&#xff08;频率分量&#xff09;&#xff0c;合成后…

【电子通识】“二八定律”(巴莱多定律)在电子维修中也是这样吗?

二八定律的大意是说&#xff1a;少数20%的东西&#xff0c;占据了80%的另外一种东西。 比如世界大约20%的人占据了大约80%的财富&#xff1b;地球上20%的国家占据了80%的石油资源&#xff1b;太阳系中80%的质量集中在20%的天体上面&#xff1b;20%的疾病是80%病死者的直接死亡原…

什么是弹性云服务器(ECS)

弹性云服务器&#xff08;Elastic Cloud Server&#xff0c;ECS&#xff09;是由CPU、内存、操作系统、云硬盘组成的基础的计算组件。弹性云服务器创建成功后&#xff0c;您就可以像使用自己的本地PC或物理服务器一样&#xff0c;在云上使用弹性云服务器。 云服务器ECS&#x…

微软如何打造数字零售力航母系列科普07 - Azure PlayFab:你从未想过的世界上最大的开发工具(平台)

Azure PlayFab&#xff1a;你从未想过的世界上最大的开发工具 微软的James Gwertzman告诉GamesIndustry.biz Academy他帮助开发者成功的使命 制作游戏比以往任何时候都更容易上手。现在有无数的游戏引擎可供选择&#xff0c;其中大多数是免费的&#xff0c;PC空间的店面也同样重…

【CAN】知识点:错误帧、远程帧、过载帧

0、帧用途 数据帧:用于发送单元向接收单元传送数据的帧; 远程帧:用于接收单元向具有相同标识符的发送单元请求数据的帧; 错误帧:用于当检测出错误时向其它单元通知错误的帧; 过载帧:用于接收单元通知其尚未做好接收准备的帧 1、远程帧 1.1 帧结构 数据帧和远程帧有标…

C++深度解析教程笔记7

C深度解析教程笔记7 第13课 - 进阶面向对象&#xff08;上&#xff09;类和对象小结 第14课 - 进阶面向对象&#xff08;下&#xff09;类之间的基本关系继承组合 类的表示法实验-类的继承 第15课 - 类与封装的概念实验-定义访问级别cmd 实验小结 第16课 - 类的真正形态实验-st…

链表经典面试题上

目录 创作不易&#xff0c;如若对您有帮助&#xff0c;还望三连&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 题目一&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目二&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff…

攻防世界XCTF-WEB入门12题解题报告

WEB入门题比较适合信息安全专业大一学生&#xff0c;难度低上手快&#xff0c;套路基本都一样 需要掌握&#xff1a; 基本的PHP、Python、JS语法基本的代理BurpSuite使用基本的HTTP请求交互过程基本的安全知识&#xff08;Owasp top10&#xff09; 先人一步&#xff0c;掌握W…

EasyExcel 处理 Excel

序言 本文介绍在日常的开发中&#xff0c;如何使用 EasyExcel 高效处理 Excel。 一、EasyExcel 是什么 EasyExcel 是阿里巴巴开源的一个 Java Excel 操作类库&#xff0c;它基于 Apache POI 封装了简单易用的 API&#xff0c;使得我们能够方便地读取、写入 Excel 文件。Easy…