Netty-核心组件

核心组件

  • 1.Bootstrap和ServerBootstrap
  • 2.Future和ChannelFuture
  • 3.Channel
  • 4.Selector
  • 5.NioEventLoop
  • 6.NioEventLoopGroup
  • 7.ByteBuf
  • 8.ChannelHandler
  • 9.ChannelHandlerContext
  • 10.ChannelPipeline

1.Bootstrap和ServerBootstrap

Bootstrap是Netty的启动程序,⼀个Netty应⽤通常由⼀个Bootstrap开始。Bootstrap的主要作⽤是配置Netty程序,串联Netty的各个组件。

  • Bootstrap: 客户端的启动程序
  • ServerBootstrap:服务端启动程序

2.Future和ChannelFuture

Netty的所有操作都是异步的,即不能⽴刻得知消息是否被正确处理。因此需要通过Future和ChannelFuture来注册监听器,当操作执⾏成果或者失败来调⽤具体的监听器。

Future通过sync⽅法来获得同步执⾏的效果。

ChannelFuture和Future的子类,提供了针对于Channel的异步监听操作。

3.Channel

Channel是Netty⽹络通信的重要组件,⽤于执⾏⽹络IO操作。Channel具备以下能力:

  • 获得当前⽹络连接通道的状态

  • 网络连接的配置参数

  • 提供异步的⽹络IO操作,⽐如建⽴连接、绑定端⼝、读写操作等

  • 获得ChannelFuture实例,并注册监听器到ChannelFuture上,⽤于监听IO操作的成功、失败、取消时的事件回调。

Channel具体的实现类有以下几种:

  • NioSocketChannel: 异步的客户端TCP Socket连接通道

  • NioServerSocketChannel:异步的服务端TCP Socket连接通道

  • NioDatagramChannel:异步的UDP连接通道

  • NioSctpChannel:异步的客户端Sctp连接通道

  • NioSctpServerChannel:异步的服务端Sctp连接通道

4.Selector

通过Selector多路复⽤器实现IO的多路复⽤。Selector可以监听多个连接的Channel事件,同时可以不断的查询已注册Channel是否处于就绪状态,实现⼀个线程可以⾼效的管理多个Channel。

5.NioEventLoop

NioEventLoop内部维护了⼀个线程和任务队列,⽀持异步提交执⾏任务。当线程启动时会调用NioEventLoop的run⽅法来执⾏io任务或非io任务。

  • io任务:如accept、connect、read、write事件等,由processSelectedKeys方法触发。

  • 非io任务:如register0、bind0等任务将会被添加到taskQueue任务队列中,由runAllTasks⽅法触发。

6.NioEventLoopGroup

管理NioEventLoop的⽣命周期,可以理解为是线程池,内部维护了⼀组线程。每个线程(即NioEventLoop)负责处理多个Channel上的事件。注意,⼀个Channel只对应⼀个线程,NioEventLoop和Channel它们是⼀对多的关系。

7.ByteBuf

ByteBuf优化了ByteBuffer的使⽤逻辑。ByteBuf底层是⼀个字节数组组成,它提供了两个指针分别标识可读的位置和可写的位置,配合capacity容量属性,将数组划分成三个区域,分别为:

  • 已经读取的区域:[0, readerIndex)

  • 可读取的区域:[readerIndex,writerIndex)

  • 可写的区域:[writerIndex,capacity)

在这里插入图片描述

public class ByteBufDemo {public static void main(String[] args) {// 创建一个容量为10的ByteBuf对象ByteBuf buf = Unpooled.buffer(10);System.out.println("init buf:" + buf);for (int i = 0; i < 5; i++) {buf.writeByte(i);}System.out.println("after write:" + buf);// 读数据// 按照索引获取数据for (int i = 0; i < 3; i++) {System.out.println(buf.getByte(i));}System.out.println("after get:" + buf);//读取数据for (int i = 0; i < 3; i++) {System.out.println(buf.readByte());}System.out.println("after read:" + buf);System.out.println("readIndex: " + buf.readerIndex());System.out.println("writerIndex: " + buf.writerIndex());System.out.println("writerIndex(8): " + buf.writerIndex(8));System.out.println("capacity: " + buf.capacity());}
}

8.ChannelHandler

ChannelHandler用于处理拦截IO事件,往往在ChannelHandler中可以加⼊业务处理逻辑。ChannelHandler执⾏完后会将IO事件转发到ChannelPipeline中的下⼀个处理程序。

9.ChannelHandlerContext

保存Channel相关的上下⽂信息,并关联⼀个ChannelHandler对象

10.ChannelPipeline

ChannelPipeline是⼀个双向链表,其中保存着多个ChannelHandler。

ChannelPipeline实现了⼀种⾼级形式的过滤器模式,在IO操作时发⽣的⼊站和出站事件,会导致ChannelPipeline中的多个ChannelHandler被依次调⽤。

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

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

相关文章

Modern C++ std::variant的实现原理

前言 std::variant是C17标准库引入的一种类型&#xff0c;用于安全地存储和访问多种类型中的一种。它类似于C语言中的联合体&#xff08;union&#xff09;&#xff0c;但功能更为强大。与联合体相比&#xff0c;std::variant具有类型安全性&#xff0c;可以判断当前存储的实际…

SQL注入:堆叠注入-强网杯[随便注]

目录 什么是堆叠注入&#xff1f; 强网杯-随便注 rename && alter绕过 prepare绕过 Handle绕过 靶机&#xff1a;BUUCTF在线评测 什么是堆叠注入&#xff1f; 在一些场景中&#xff0c;应用程序支持一次执行多条SQL语句&#xff0c;我们称为堆叠查询&#xff0c;…

MyBatis-Plus:通用分页实体封装

分页查询实体&#xff1a;PageQuery package com.example.demo.demos.model.query;import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; import org.springframework.util.St…

MYSQL数据库详解

一、数据库的基本概念 数据&#xff08;data&#xff09;&#xff1a;指对客观事物进行描述并可以鉴别的符号。这些符号是可识别的&#xff0c;抽象的。 比如数字、图片、音频等。 数据库管理系统&#xff08;DBMS&#xff09;&#xff1a;数据库极其管理它的软件组成。 数据库…

机器人内部传感器阅读笔记及心得-位置传感器-电位器式位置传感器

位置传感器 位置感觉是机器人最基本的感觉要求&#xff0c;可以通过多种传感器来实现。位置传感器包括位置和角度检测传感器。常用的机器人位置传感器有电位器式、光电式、电感式、电容式、霍尔元件式、磁栅式及机械式位置传感器等。机器人各关节和连杆的运动定位精度要求、重…

qt-OPENGL-星系仿真

qt-OPENGL-星系仿真 一、演示效果二、核心程序三、下载链接 一、演示效果 二、核心程序 #include "model.h"Model::Model(QOpenGLWidget *_glWidget) { glWidget _glWidget;glWidget->makeCurrent();initializeOpenGLFunctions(); }Model::~Model() {destroyV…

Dockerfile第十七章 : Dockerfile文件与指令说明

第十七章 : Dockerfile文件与指令说明 本章知识点: 本文介绍了Dockerfile的编写规则、基本结构、执行顺序以及常用指令的说明。Dockerfile的编写需要遵循一定的规则,包括使用指令、构建上下文和文件路径等。基本结构包括基础镜像信息、维护者信息、镜像操作指令和容器启动…

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture04反向传播

lecture04反向传播 课程网址 Pytorch深度学习实践 部分课件内容&#xff1a; import torchx_data [1.0,2.0,3.0] y_data [2.0,4.0,6.0] w torch.tensor([1.0]) w.requires_grad Truedef forward(x):return x*wdef loss(x,y):y_pred forward(x)return (y_pred-y)**2…

View绘制

1. 首次 View 的绘制流程是在什么时候触发的? 是在 ActivityThread.handleResumeActivity 里触发的。 最终通过 WindowManagerImpl.addView -> WindowManagerGlobal.addView -> ViewRootImpl.setView -> ViewRootImpl.requestLayout 就触发了第一次 View 的绘制。 2.…

java 项目管理工具gradle

项目管理工具gradle gradle简介Gradle测试Gradle构建工具集成下载安装gradleGradle基础知识Gradle构建脚本gradle依赖管理Gradle插件Gradle仓库Gradle多项目构建Gradle自定义任务

浅谈WPF之利用RichTextBox实现富文本编辑器

在实际应用中&#xff0c;富文本随处可见&#xff0c;如留言板&#xff0c;聊天软件&#xff0c;文档编辑&#xff0c;特定格式内容等&#xff0c;在WPF开发中&#xff0c;如何实现富文本编辑呢&#xff1f;本文以一个简单的小例子&#xff0c;简述如何通过RichTextBox实现富文…

Zabbix 6.2.1 安装

目录 1、监控介绍 监控的重要性 网站的可用性 监控范畴 如何监控 2、Zabbix 介绍 zabbix 简介 zabbix 主要功能 zabbix 监控范畴 Zabbix 监控组件 zabbix 常见进程 zabbix agentd 工作模式 zabbix 环境监控中概念 3、搭建LNMP 拓扑规划 安装MySQL 安装 Nginx …

【深度学习笔记】1 数据操作

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 数据操作 在深度学习中&#xff0c;我们通常会频繁地对数据进行操作。作为动手学深度学习的基础&#xff0c;本节将介绍如何对内存中的数据进行操作。 在PyTorch中&a…

【智能家居】7、主程序编写+实现语音、网络和串口功能

需要毕业论文私信有偿获取 截止目前mainPro.c代码 #include <stdio.h> #include <string.h>#include "controlDevices.h" #include "inputCmd.h"struct Devices *findDevicesName(char *name,struct Devices *phead){struct Devices *tmp=ph…

2012及其以上系统修改服务器密码指南

修改服务器密码指南,目前介绍两种不同的方案 方法一 指令式 winR键 弹出运行框里输入 cmd 点击确认或者右下角开始程序里面的点开运行 2.在弹出框里手动输入以下一组文字&#xff1a;net user administrator 123456 框内无法粘贴 需要手动输入 其中administrator 是用…

java基础-List常用方法

目录 常用方法逆序升序List<自定义类>排序List删除元素List转String数组List的add函数查找一个,分隔的字符串中是否有某值根据.分割字符串根据空格分隔字符串 常用方法 逆序 Collections.reverse(List) 升序 Collections.sort(List) List<自定义类>排序 首先…

静态链表的应用

简介 静态链表也是由数据域与指针域两部分组成的一个结构体&#xff0c;只不过指针域是由整数下标表示 struct node{int data;//数据域int next;//指针域};求两个链表首个公共结点的地址 #include <cstdio> #include <cstring> using namespace std; const int …

贝叶斯统计——入门级笔记

绪论 1.1 引言 全概率公式 贝叶斯公式 三种信息 总体信息 当把样本视为随机变量时&#xff0c;它有概率分布&#xff0c;称为总体分布&#xff0e; 如果我们已经知道总体的分布形式这就给了我们一种信息&#xff0c;称为总体信息 样本信息 从总体中抽取的样本所提供的信息 先…

【PX4学习笔记】13.飞行安全与炸机处理

目录 文章目录 目录使用QGC地面站的安全设置、安全绳安全参数在具体参数中的体现安全绳 无人机炸机处理A&#xff1a;无人机异常时控操作B&#xff1a;无人机炸机现场处理C&#xff1a;无人机炸机后期维护和数据处理D&#xff1a;无人机再次正常飞行测试 无人机飞行法律宣传 使…

22. 【Linux教程】Linux 结束进程

前面小节介绍了如何启动一个程序进程&#xff0c;还介绍了如何查看系统进程信息&#xff0c;本小节来介绍如何通过 kill 命令结束进程。 1. Linux 进程信号介绍 下面列举出 Linux 进程信号的描述&#xff1a; 信号名称描述1HUP挂起2INT中断3QUIT结束运行9KILL无条件终止11SEG…