Netty—Channel

news2024/11/24 18:55:36

文章目录

  • 一、Channel 是什么?🤔️
  • 二、 Channel 的继承体系👪
  • 三、Channel 的初始化过程 🔍
    • 首先,channel() 指定 ChannelFactory 类型
    • 其次,Channel 实例化

一、Channel 是什么?🤔️

Netty 中的 Channel 可以看成网络编程中的 Socket,其提供了一系列 IO 操作的 API,比如 read、write、bind、connect 等,大大降低了直接使用 Socket 类的复杂性。同时也包含了 Netty 框架相关的一些功能,包括获取 Channel 的 EventLoop,获取缓冲区分配器 ByteBufAllocator 和 pipeline 等。

二、 Channel 的继承体系👪

Channel 类体系的设计与其实现功能密不可分,父类中实现的是子类共同的功能。在多层次的抽象类中,每一个层次的抽象类负责实现一种功能。

从上面的继承关系可以看出,NioSocketChannel 和 NioServerSocketChannel 分别对应客户端和服务端的 Channel,两者的直接父类不一致,因此对外提供的功能也是不相同的。比如当发生 read 事件时,NioServerSocketChannel 的主要逻辑就是建立新的连接,而 NioSocketChannel 则是读取传输的字节进行业务处理。

Channel 定义了 核心方法

public interface Channel extends AttributeMap, ChannelOutboundInvoker, Comparable<Channel> {
    // 返回此Channel的全局唯一标识符
    ChannelId id();
    // 返回此Channel被注册到的EventLoop
    EventLoop eventLoop();
		// 返回此Channel的父Channel,如果是ServerSocketChannel实例则返回null,而SocketChannel实例则返回创建其对应的ServerSocketChannel
    Channel parent();
		// 返回该通道的配置参数
    ChannelConfig config();
		// 如果通道是打开的并且稍后可能会激活,则返回true
    boolean isOpen();
		// 返回此Channel是否已经注册到EventLoop
    boolean isRegistered();
  	// 返回此Channel是否处于激活状态
    boolean isActive();
  	// 返回此channel的元数据
    ChannelMetadata metadata();
		// 返回此channel绑定到的本地地址。
    SocketAddress localAddress();
		// 返回连接到此channel的远程地址。
    SocketAddress remoteAddress();
		// 通道的关闭凭证,当该通道关闭时将通知它。可以同步阻塞,也可以添加执行器异步去处理
    ChannelFuture closeFuture();
		// 是否可写,如果通道的写缓冲区未满,即返回true,表示写操作可以立即 操作缓冲区,然后返回。
    boolean isWritable();
    long bytesBeforeUnwritable();
    long bytesBeforeWritable();
		// 返回 Unsafe
    Unsafe unsafe();
		// 返回 管道
    ChannelPipeline pipeline();
		// 返回 字节缓冲区分配器
    ByteBufAllocator alloc();

    @Override
    Channel read();

    @Override
    Channel flush();
	
  	
    interface Unsafe {
			// 略...
    }
}

Unsafe ——Channel 的辅助接口

此 Unsafe 非 java中的Unsafe,它可以看作是 Channel 的辅助接口,它不能被用户代码直接调用!实际的网络IO操作基本都是由 Unsafe功能类负责实现的。

在这里插入图片描述

其中 io.netty.channel.AbstractChannel.AbstractUnsafe 实现了register、bind、close等方法。其还有一个抽象类io.netty.channel.nio.AbstractNioChannel.AbstractNioUnsafe,它包含了两个常用的实现类:

  • io.netty.channel.nio.AbstractNioMessageChannel.NioMessageUnsafe,通过以下初始化源码分析我们发现NioServerSocketChannel初始化时创建的unsafe是NioMessageUnsafe。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • io.netty.channel.nio.AbstractNioByteChannel.NioByteUnsafe

三、Channel 的初始化过程 🔍

下面就以 NioServerSocketChannel 为例,带大家了解下该类的初始化过程,整体流程如下:

  1. 启动引导类中通过 channel() 方法指定生成的 ChannelFactory 类型
    1. 启动引导类中通过 channel() 指定底层创建的 Channel 类型
    2. 根据指定的 Channel 类型创建出 ChannelFactory,后续通过该工厂类进行 Channel 的实例化
  2. 通过 ChannelFactory 来构造对应 Channel,并在实例化的过程中初始化了一些重要属性,比如 pipeline

首先,channel() 指定 ChannelFactory 类型

在上面的服务端启动过程中,ServerBootstrap 调用 channel() 方法并传入 NioServerSocketChannel,其底层代码逻辑为:

/**
* 用于从中创建通道实例的类。
*/
public B channel(Class<? extends C> channelClass) {
    return channelFactory(new ReflectiveChannelFactory<C>(
            ObjectUtil.checkNotNull(channelClass, "channelClass")
    ));
}
// ReflectiveChannelFactory 构建方法
public ReflectiveChannelFactory(Class<? extends T> clazz) {
    ObjectUtil.checkNotNull(clazz, "clazz");
    try {
      this.constructor = clazz.getConstructor();
    } catch (NoSuchMethodException e) {
      throw new IllegalArgumentException("Class " + StringUtil.simpleClassName(clazz) +
                                         " does not have a public non-arg constructor", e);
    }
}

整体逻辑很简单,通过传入的 Class 对象指定一个 Channel 反射工厂,后续调用工厂方法获取指定类型的 Channel 对象。

其次,Channel 实例化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ChannelFactory 的整体逻辑就是通过反射的方式新建 Channel 对象,而 Channel 对象的类型则是在启动引导类中通过 channel() 方法进行指定的。在实例化 Channel 的过程中,会对其内部的一些属性进行初始化,而对这些属性的了解,可以使我们对 Netty 中各个组件的作用范围有一个更加清晰的理解,下面看下 NioServerSocketChannel 的构造函数源码

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

初识Java 5-1 实现隐藏

目录 库单元&#xff1a;package 代码组织 独一无二的包名 Java访问权限修饰符 包访问权限 接口访问权限&#xff08;public&#xff09; 不可访问&#xff08;private&#xff09; 继承访问权限&#xff08;protected&#xff09; 包访问权限与公共构造器 接口与实现…

基于Java+SpringBoot+Vue前后端分离医疗挂号管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

pdf怎么转cad?几个简单方法分享给你

pdf怎么转cad&#xff1f;PDF文件转换为CAD文件是一项非常重要的任务&#xff0c;特别是对于那些需要进行工程、建筑和设计的专业人士来说。在过去&#xff0c;这项任务可能需要耗费大量时间和精力&#xff0c;但现在&#xff0c;随着技术的不断发展&#xff0c;已经有很多工具…

华为云云服务器评测| 之性能测试

文章目录 前言软件安装扩展知识 收集服务器负载信息指令解析开始压测后台运行 stress 运行 sysbench 测试网络带宽总结 测试磁盘 I/O 性能I/O 性能评估总结 前言 在当今数字化时代&#xff0c;云计算作为一种高效、灵活的计算方式&#xff0c;正日益受到企业和个人用户的广泛关…

如何远程访问Linux MeterSphere一站式开源持续测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

基于Java+SpringBoot+Vue前后端分离校园商铺管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

LeetCode 15 三数之和

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 // 1. 排序双指针 // 2. 固定一个值nums[i] 然后去剩下的位置去找 两数之和符合nums[j]nums[k]是否等于-nums[i] // 3. 细节问题&#xff1a;由于题目中是不可以包含重复的三元组的…

功率放大器的功能是什么功能

功率放大器是一种电子设备&#xff0c;用于放大输入信号的功率&#xff0c;并输出对应增强后的信号。功率放大器的功能主要包括增强信号的功率、保持信号的形状和质量、提供足够的电流和电压驱动负载&#xff0c;以满足不同应用需求。 功率放大器的主要功能是增强信号的功率。输…

阿里巴巴API接口解析,实现按关键字搜索商品

要解析阿里巴巴API接口并实现按关键字搜索商品&#xff0c;你需要进行以下步骤&#xff1a; 了解阿里巴巴API接口文档&#xff1a;访问阿里巴巴开放平台&#xff0c;找到API文档&#xff0c;了解阿里巴巴提供的API接口以及相关的参数、返回值等信息。注册开发者账号&#xff1…

远传水表和流量计的区别

远传水表和流量计是两种用于测量和控制水流的设备&#xff0c;虽然在某些方面有重叠的功能&#xff0c;但它们之间也有一些区别。下面我们将详细介绍这两种设备的区别。 一、定义和作用 远传水表是一种能够远程传输用水数据的水表&#xff0c;可以通过无线通信技术将数据传输到…

轻松解决Idea中maven无法下载源码

今天在解决问题的时候想要下载源码&#xff0c;突然发现idea无法下载&#xff0c;这是真的蛋疼&#xff0c;没办法查看原因&#xff0c;最后发现问题的原因居然是因为Maven&#xff0c;由于我使用的idea的内置的Bundle3的Maven&#xff0c;之前没有研究过本地安装和内置的区别&…

前端面试0906

// 请给出输出结果 function foo(){ console.log(a); } function bar(){ var a 3; console.log(this.a); foo(); } var a 2; bar(); 2 2 // 请从下面的问题中挑选3道进行回答 1. 防抖和节流分别是什么&#xff0c;一般用在什么场景&#xff1f; 防抖&#xff08;Debounc…

CocosCreator3.8研究笔记(七)CocosCreator 节点和组件的介绍

相信很多新手朋友&#xff0c;肯定会问&#xff0c;CocosCreator 中什么是节点&#xff1f;什么是组件&#xff1f; 一、什么是组件&#xff08;Component&#xff09;&#xff1f; Cocos Creator 3.8 的工作流程是以组件式开发为核心&#xff0c;即以组合而非继承的方式进行游…

安卓手机记事本数据转移到苹果手机上怎么操作?

国内有不少网友使用的手机都是小米、荣耀、OPPO、vivo等安卓手机&#xff0c;而再次更换手机时&#xff0c;就想要尝试一下不同的操作系统&#xff0c;例如更换一台苹果手机。不过在换手机之前&#xff0c;还有一件重要的事情需要去做&#xff0c;这就是安卓手机记事本数据转移…

RS485转0_20mA输出模块设计

文章目录 1. 简介2. 功能实现3. 测试4. 开源地址 1. 简介 结合以前发的文章&#xff0c;我们知道&#xff0c;模拟量输出有两种&#xff0c;一种是共地型&#xff0c;一种是共源型。 今天开源一款rs485隔离的转0-20ma输出模块的设计。 我设计模块的原因是为了测试公司的一款…

redis实战-redis实现分布式锁redisson快速入门

前言 集群环境下的并发问题 分布式锁 定义 需要满足的条件 常见的分布式锁 redis实现分布式锁 核心思路 代码实现 误删情况 逻辑说明 解决方案 代码实现 更为极端的误删情况 Lua脚本解决原子性问题 分布式锁-redission redisson的概念 快速入门 总结 前言 在…

Python之数值和内建函数

Python之数值和内建函数 内建常用数据类型 分类 数值型 int、float、complex、bool 序列sequence 字符串str、字节序列bytes、bytearray列表list、元组tuple 键值对 集合set、字典dict 取整 取整 int // round math.floor math.ceil说明&#xff1a;两条//斜杠是整除&…

(云HIS)云医院管理系统源码 SaaS模式 B/S架构 基于云计算技术

通过提供“一个中心多个医院”平台&#xff0c;为集团连锁化的医院和区域医疗提供最前沿的医疗信息化云解决方案。 一、概述 云HIS系统源码是一款满足基层医院各类业务需要的健康云产品。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、收费管理、病…

快速掌握高效批量分割长视频技巧,让你的视频制作更轻松

对于需要处理大量长视频的影视制作人员来说&#xff0c;视频分割是一项必不可少的任务。传统的视频分割方法需要手动进行&#xff0c;费时费力。今天&#xff0c;笔者将介绍一种快速批量分割长视频的方法&#xff0c;使用固乔智剪软件&#xff0c;提高视频制作效率。 1. 下载并…

C/C++内存布局——代码区、常量区、静态区(BSS段、Data段)

C/C内存分区 在C/C这种高级语言的层面看&#xff0c;一个程序的内存分区可以被分为&#xff1a;&#xff08;从低地址到高地址&#xff09;代码区、常量区、静态区&#xff08;已初始化&#xff08;BSS段&#xff09;、未初始化&#xff08;Data段&#xff09;&#xff09;、堆…