手撕netty源码(二)- 初始化ServerBootstrap

文章目录

  • 前言
  • 一、ServerBootstrap 的创建和初始化
    • 1.1 创建
    • 1.2 初始化group
    • 1.3 初始化channel
    • 1.3 初始化option和attr
    • 1.4 初始化handler 和 childHandler
  • 总结


前言

接上一篇:手撕netty源码(一)- NioEventLoopGroup
本篇讲解 ServerBootstrap 的创建以及初始化:group、channel、option、attr、handler、childHandler


一、ServerBootstrap 的创建和初始化

在这里插入图片描述

public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel>public class Bootstrap extends AbstractBootstrap<Bootstrap, Channel>

看的出来,AbstractBootstrap 是个比较重要的类,他里面其实包含了netty客户端和服务端的逻辑,所以有些属性和方法要注意一下

1.1 创建

创建很简单,只是new了一个对象而已

ServerBootstrap b = new ServerBootstrap();// io/netty/bootstrap/ServerBootstrap.java
public ServerBootstrap() {
}

1.2 初始化group

可以看到,这个操作其实只是初始化了 ServerBootstrap 的两个属性:group 和 childGroup

b.group(bossGroup, workerGroup)// io/netty/bootstrap/ServerBootstrap.java
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {super.group(parentGroup);if (this.childGroup != null) {throw new IllegalStateException("childGroup set already");}this.childGroup = ObjectUtil.checkNotNull(childGroup, "childGroup");return this;
}// 下面是super.group(parentGroup)
// io/netty/bootstrap/AbstractBootstrap.java
public B group(EventLoopGroup group) {ObjectUtil.checkNotNull(group, "group");if (this.group != null) {throw new IllegalStateException("group set already");}this.group = group;return self();
}

1.3 初始化channel

这一步其实是初始化 channelFactory ,可以看到,实际的channelFactory 实现是 ReflectiveChannelFactory,即通过反射来创建 channel,不过这里并没有开始创建 channel ,只是给 channelFactory 属性赋了值

b.channel(NioServerSocketChannel.class);//io/netty/bootstrap/AbstractBootstrap.java
public B channel(Class<? extends C> channelClass) {return channelFactory(new ReflectiveChannelFactory<C>(ObjectUtil.checkNotNull(channelClass, "channelClass")));
}//io/netty/bootstrap/AbstractBootstrap.java
public B channelFactory(io.netty.channel.ChannelFactory<? extends C> channelFactory) {return channelFactory((ChannelFactory<C>) channelFactory);
}//io/netty/bootstrap/AbstractBootstrap.java
public B channelFactory(ChannelFactory<? extends C> channelFactory) {ObjectUtil.checkNotNull(channelFactory, "channelFactory");if (this.channelFactory != null) {throw new IllegalStateException("channelFactory set already");}this.channelFactory = channelFactory;return self();
}

1.3 初始化option和attr

AbstractBootstrap 定义了两个ConcurrentHashMap

  • ChannelOption 主要是用于配置netty中一些相关的参数,这些参数的key已经在ChannelOption中以静态变量的方式设置好了,可以直接拿来使用,并且配置相关的value,如果ChannelOption设置了一个不存在的key,就会以日志的形式提示错误信息,但是不会抛出异常。
  • AttributeKey 主要用于维护业务数据,业务数据随着业务流转
private final Map<ChannelOption<?>, Object> options = new ConcurrentHashMap();
private final Map<AttributeKey<?>, Object> attrs = new ConcurrentHashMap();public <T> B option(ChannelOption<T> option, T value) {ObjectUtil.checkNotNull(option, "option");if (value == null) {this.options.remove(option);} else {this.options.put(option, value);}return this.self();
}public <T> B attr(AttributeKey<T> key, T value) {ObjectUtil.checkNotNull(key, "key");if (value == null) {this.attrs.remove(key);} else {this.attrs.put(key, value);}return this.self();
}

稍微往里面看一看,会发现ChannelOption和AttributeKey都继承了AbstractConstant,且内部都使用ConstantPool维护了数据 。
这里注意一下:ChannelOption和AttributeKey都提供了方法valueOf和newInstance,二者的区别是 valueOf 同样的参数 多次调用返回的是同一个对象,而newInstance 同样的参数 多次调用返回的是不同的对象

1.4 初始化handler 和 childHandler

handler 被定义在AbstractBootstrap,childHandler 被定义在ServerBootstrap。所以 handler 服务端和客户端都会被用到,而childHandler 只有服务端可以用到

// io/netty/bootstrap/AbstractBootstrap.java
public B handler(ChannelHandler handler) {this.handler = ObjectUtil.checkNotNull(handler, "handler");return self();
}// io/netty/bootstrap/ServerBootstrap.java
public ServerBootstrap childHandler(ChannelHandler childHandler) {this.childHandler = ObjectUtil.checkNotNull(childHandler, "childHandler");return this;
}

总结

本文先简单介绍一下 ServerBootstrap 的创建和属性初始化赋值,并没有实质的操作,下一篇会讲解 bind 方法,这个方法里有很多内容

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

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

相关文章

Vue

文章目录 Vue1. 创建Vue实例2. 插值表达式3. 响应式特性4. 常用指令4.1 内容渲染指令4.2 条件渲染指令4.3 事件绑定指令4.4 单向属性绑定指令4.5 双向属性绑定指令4.6 列表渲染指令 5. 修饰符5.1 事件修饰符5.2 键盘事件修饰符5.3 修饰符串联5.4 v-model 修饰符 6. computed计算…

Android SDK Manager安装Google Play Intel x86 Atom_64 System Image依赖问题

Package Google Play Intel x86 Atom_64 System Image,Android API R, revision 2 depends on SDK Platform Android R Preview, revision 2 问题 一开始以为网络还有依赖包没有勾选&#xff0c;尝试了很多次&#xff0c;勾选这边报错对应的license即可。此时点击一下其他licen…

CountDownLatch使用错误+未最终断开连接导致线程池资源耗尽

错误描述&#xff1a; 我设置了CountDownLatch对线程的协作做出了一些限制&#xff0c;但是我发现运行一段时间以后便发现定时任务不运行了。 具体代码&#xff1a; public void sendToCertainWeb() throws IOException, InterruptedException {List<String> urlList …

如何利用美国站群服务器实现有效的SEO优化策略?

如何利用美国站群服务器实现有效的SEO优化策略? 在当今数字化时代&#xff0c;SEO优化对于网站的可见性和吸引力至关重要。站群服务器作为一种有效的SEO策略&#xff0c;可以通过多个相关联的网站在不同服务器上的部署&#xff0c;增强网站的权威性和链接多样性。尤其是在利用…

ZYNQ之嵌入式开发04——自定义IP核实现呼吸灯、固化程序

文章目录 自定义IP核——呼吸灯实验固化程序 自定义IP核——呼吸灯实验 Xilinx官方提供了很多IP核&#xff0c;在Vivado的IP Catalog中可以查看这些IP核&#xff0c;在构建自己复杂的系统时&#xff0c;只使用Xilinx官方的免费IP核一般满足不了设计的要求&#xff0c;因此很多…

机器人自动驾驶时间同步进阶

0. 简介 之前时间同步也写过一篇文章介绍机器人&自动驾驶中的时间同步。在最近的学习中发现一些额外需要阐述学习的内容&#xff0c;这里就再次写一些之前没写到的内容。 1. NTP NTP 是网络时间协议&#xff0c;用来同步网络中各计算机时间的协议&#xff0c;把计算机的时…

品牌差异化战略:Kompas.ai如何打造独特的内容声音

在当今竞争激烈的商业环境中&#xff0c;品牌差异化已成为企业获取市场优势的关键策略。一个鲜明的品牌形象和独特的内容声音不仅能够帮助企业吸引目标客户&#xff0c;还能够在消费者心中建立起独特的地位。本文将深入探讨品牌差异化的重要性&#xff0c;分析Kompas.ai如何帮助…

揭秘 IDM:下载管理大师的全面指南与实用技巧深度解析

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的下载管理软件&#xff0c;它可以帮助用户以更快的速度下载文件&#xff0c;并且支持多种协议和浏览器。IDM 通过将大文件分割成多个部分并同时下载这些部分来加快下载速度&#xff0c;这种技术被称为多线程下…

Linux中手工创建一个用户

当我们需要新创建一个用户时&#xff0c;有两种方法 1&#xff0c;使用useradd命令&#xff1a; [rootlocalhost /]# useradd tmg 然后给它设置一个密码 [rootlocalhost etc]# passwd tmg Changing password for user tmg. New password: BAD PASSWORD: The password is a…

通过 USB 或网络控制安卓设备:无需 root 权限 | 开源日报 No.231

barry-ran/QtScrcpy Stars: 15.6k License: Apache-2.0 QtScrcpy 是一款支持通过 USB 或网络显示和控制 Android 设备的实时显示控制软件&#xff0c;不需要 root 权限。 其主要功能和优势包括&#xff1a; 轻量化&#xff08;仅显示设备屏幕&#xff09;高性能&#xff08;3…

RAG:智能图书馆员引领AI的知识之旅

想象一下&#xff0c;你是一个法官&#xff0c;面对一个复杂的案件&#xff0c;你需要查阅大量的法律文献来找到相关的案例和法律条文。在AI的世界里&#xff0c;也有一个类似的“法官”——大型语言模型&#xff08;LLMs&#xff09;。它们能够回答各种问题&#xff0c;但有时…

vue 表格获取当前行索引,加颜色

vue 表格获取当前行索引&#xff0c;加颜色 <span styledisplay:inline-block;width:10px;height:10px;border-radius:50% :style"{background:color[scope.$index]}" />//定义颜色color: [#5387F7, #A794E0, #F3543C, #999999, #77D3F8, #FFA1B4, #26CEBA, #…

C++从入门到精通——C++动态内存管理

C动态内存管理 前言一、C/C内存分布分类1分类2题目选择题sizeof 和 strlen 区别示例sizeofstrlen 二、C语言中动态内存管理方式malloc/calloc/realloc/free示例例题malloc/calloc/realloc的区别malloc的实现原理 三、C内存管理方式new/delete操作内置类型new和delete操作自定义…

vue3 引入@tsparticles/vue3和@tsparticles/slim 实现粒子特效

1.安装&#xff1a; yarn add tsparticles/vue3 tsparticles/slim2.main.ts 引入 import Particles from "tsparticles/vue3"; import { loadSlim } from "tsparticles/slim";app.use(Particles as any, {init: async (engine: any) > {await loadSli…

力扣刷题 70.爬楼梯

题干 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&…

电子邮件免费版有哪些?免费注册电子邮箱

电子邮件有付费版和免费版两种类型&#xff0c;付费版通常具有更大的电子邮箱容量和更强大的电子邮箱功能。但是对于我们个人用户或者是中小型企业来说注册电子邮箱免费版的就够日常使用了。电子邮件的免费版提供商有Zoho Mail、微软、腾讯等&#xff0c;今天我们就来具体了解下…

Django中的实时通信:WebSockets与异步视图的结合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代Web应用程序中&#xff0c;实时通信已经成为了必不可少的功能之一。无论是在线聊天、…

光纤、以太网电缆和 DSL 的比较:技术指南

了解光纤、以太网电缆和 DSL 之间的差异对于做出有关互联网连接的明智决策至关重要。本技术指南对这些技术进行了全面比较&#xff0c;讨论了它们的独特功能、性能指标和应用。它旨在为您提供必要的知识&#xff0c;以选择最适合您的特定需求的选项。 光纤、以太网电缆和 DSL …

【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 目录 …

【C++】优先队列

优先队结构的不同物理结构与常用操作算法 优先队列是一种特殊的队列,队列中的元素具有优先级,每次弹出操作会弹出优先级最高的元素。 优先队列常用的物理结构有: 1. 数组:简单但不高效,插入和删除操作需要移动大量元素,时间复杂度高。 2. 二叉堆:是一种完全二叉树,通常用数…