Netty核心组件介绍

news2024/12/24 10:07:32

Netty是一款用于创建高性能网络应用程序的高级框架。Netty的核心组件如下:

  • Channel
  • 回调
  • Future
  • 事件和ChannelHander

Channel

channel是Java NIO的一个基本构造。可以把Channel看作是传入或传出数据的载体。它可以被打开或关闭,连接或断开连接。

回调

Netty在内部使用了回调来处理事件:当一个回调被触发时,相关的事件可以被一个ChannelHandler的实现处理。
如:

public class ContentHandler extends ChannelInboundHandlerAdapter {
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		System.out.println("client " + ctx.channel().remoteAddress() + " connected");
	}
}

Future

Future提供了另一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操作的结果的占位符,它将在未来的某个时刻完成,并提供对其结果的访问。
JDK预置了java.util.concurrent.Future,但是其所提供的实现只允许手动检查对应的操作是否已经完成,或者一直阻塞直到它完成。Netty提供了它自己的实现——ChannelFuture,用于在执行异步操作的时候用。每个Netty的io操作都将返回一个ChannelFuture,也就是说它们都不会阻塞。Netty是完全异步和事件驱动的。
使用方法如下:

	Channel channel = ... ;
	ChannelFuture future = channel.connect(new InetSocketAddress("192.168.0.1", 25));
	future.addListener(new ChannelFutureListener() {
		public void operationComplete(ChannelFuture future) {
			if(future.isSuccess()) {
				ByteBuf buffer = Unpooled.copiedBuffef("Hello", Charset.defaultCharset());
				ChannelFuture wf = future.channel().writeAndFlush(buffer);
			} else {
				future.cause().printStackTrace();	
			}
		}
	});

事件和ChannelHandler

Netty使用不同的事件来通知我们状态的改变或操作的状态。这使得我们能够根据已经发生的事件来触发适当的动作。Netty是一个网络编程框架,所以事件是按照它们与入站或出站数据流的相关性进行分类的。可能由入站数据或者相关的状态更改而触发的事件包括:

  • 连接已被激活或连接失活

  • 数据读取

  • 用户事件

  • 错误事件
    出站事件是未来将会触发的某个动作的操作结果,这些动作包括:

  • 打开或关闭到远程节点的连接

  • 将数据写到或冲刷到套接字

每个事件都可以被分发给ChannelHandler类中的某个用户实现的方法。下图展示了一个事件是如何被一个这样的ChannelHandler链处理的。
在这里插入图片描述
你可以认为每个ChannelHandler的实例都类似于一种为了响应特定事件而被执行的回调。

合在一起

Future、回调和ChannelHandler

Netty的异步编程模型是建立在Future和回调的概念之上的,而将事件派发到ChannelHandler的方法则发生在更深的层次上。结合在一起,这些元素就提供了一个处理环境,使你的应用程序逻辑可以独立于任何网络操作相关的顾虑而独立地演变。这也是Netty的设计方式的一个关键目标。
拦截操作以及高速地转换入站数据和出站数据,都只需要你提供回调或利用操作返回的Future。这使得链接操作变得既简单又高效,并且促进了可重用的通用代码的编写。

选择器、事件和EventLoop

Netty通过触发事件将Selector从应用程序中抽象出来,消除了所有将需要手动编写的派发代码。在内部,为每个Channel分配一个EventLoop,用以处理所有事件,包括:

  • 注册感兴趣的事件
  • 将事件派发给ChannelHandler
  • 安排进一步的动作

EventLoop本身只由一个线程驱动,其处理了一个Channel的io事件,并且在该EventLoop的整个生命周期内都不会改变。这个简单而强大的设计消除了你所有可能有的在ChannelHandler实现中需要进行同步的任何顾虑,因此你可以专注于提供正确的逻辑,用来在有感兴趣的数据要处理的时候执行。

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

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

相关文章

JVM---垃圾回收

目录 一、C/C的内存管理 二、Java的内存管理 三、垃圾回收的对比 四、Java的内存管理和自动垃圾回收 五、方法区的回收 手动触发回收 六、堆回收 如何判断堆上的对象可以回收? 引用计数法 可达性分析算法 五种对象引用 软引用 软引用的使用场景-缓存 弱引用 虚…

window.location.href的介绍及使用

目录 介绍: 获取当前 URL 设置新的 URL URL 的组成部分 解析 URL 参数 什么是片段标识符的URL? 使用new URL: 输出的部分解释: 假如我们需要获取路径上的最后一级的路径名: 介绍: window.location.h…

vscode默认终端设置为cmd的方法

vscode默认终端是powershell,执行某些命令时会提示权限等问题,如果更习惯使用cmd终端的话,可以将默认终端配置为cmd。 方法一: 方法二: 如果你想更改默认的终端,可以通过以下步骤操作: 打开 VSCode。使用…

【QT学习】补充:qt使用已经存在的类

1.右键项目--》添加现有文件 注意:不是添加新文件!!! 2.添加配置

Ubuntu24安装搜狗输入法,修复闪屏问题

下载deb安装包:搜狗输入法linux-首页 安装:sudo dpkg -i 1.deb 搜狗输入法linux-安装指导 重启,但是完成后闪烁。按以下步骤更改桌面配置。 sudo gedit /etc/gdm3/custom.conf 取消WaylandEnable的注释即可

【免费Java系列】大家好 ,今天是学习面向对象高级的第十二天点赞收藏关注,持续更新作品 !

这是java进阶课面向对象第一天的课程可以坐传送去学习http://t.csdnimg.cn/Lq3io day10-多线程 一、多线程常用方法 下面我们演示一下getName()、setName(String name)、currentThread()、sleep(long time)这些方法的使用效果。 public class MyThread extends Thread{publi…

sklearn之线性回归——以上证红利指数为例

文章目录 线性回归概念使用sklearn实现上证中立指数预测内置数据集的加载与处理 外部数据集的加载和处理数据内容数据加载和处理 开始预测分割数据集导入线性回归模型查看线性回归模型的系数绘制预测结果预测效果评估 最终代码 线性回归 线性回归(Linear Regressio…

Linux·基本指令

从本节开始将新开一个关于Linux操作系统的板块,其实Linux也没什么太神秘的,就是一个操作系统(OS)嘛,跟Windows操作系统是一个概念,只不过Windows中的大部分操作都是用光标点击来进行人机交互,但是Linux是通过输入命令行…

AIGC、LLM 加持下的地图特征笔记内容生产系统架构设计

文章目录 背景构建自动化内容生产平台系统架构设计架构详细设计流程介绍笔记来源笔记抓取干预 笔记 AIGC 赋能笔记 Rule 改写笔记特征库构建 附录Bash Cron 定时任务Golang 与 Pyhon AIGC 实践 小结 背景 在大模型的浪潮下,ChatGPT、Sora、Gemini、文言一心 等新技…

LoRaWAN入门

1.文档资料 飞书云文档 (feishu.cn) G43室内LoRaWAN网关 - doc.alinkwise.com > LoRaWAN网关(基站) > G4x > G43室内LoRaWAN网关 2.简介 LoRa: 远距离无线电(long rang radio), 它最大特点就是在同样的功耗条件下比其他无线方式…

《构建合同中台系统:实现合同管理的集成化与智能化》

随着企业数字化转型的深入推进,合同管理作为企业日常运营的重要组成部分,也在不断演进与升级。传统的合同管理方式已经无法满足企业对于效率、合规性和智能化的需求,因此,构建合同中台系统成为了当下企业迫切需要解决的问题。 **1…

Vue中进行粘贴板粘贴数据(图片、文字等)

在页面中如果需要进行粘贴数据,那么就要读取系统粘贴板clipboard,通过此Api来进行粘贴板数据的操作。 目录: 一.封装相关函数1.示例代码:2.代码解释: 二.页面中进行粘贴1.代码示例:2.代码解释: 三.运行结果…

C数据结构:队列

目录 队列是什么? 队列的实现 队列的数据结构 队列的初始化 队列的插入 队列的删除 获取队列队头元素 获取队列队尾元素 获取队列元素个数 检查队列是否为空 队列的销毁 队列的使用 完整代码 队列是什么? 队列也是顺序表中的一种 队列和栈…

Python-VBA函数之旅-staticmethod函数

目录 一、staticmethod函数的常见应用场景 二、staticmethod函数使用注意事项 三、如何用好staticmethod函数? 1、staticmethod函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://blog…

Linux(Ubuntu24.04) 安装 MinIO

本文所使用的 Ubuntu 系统版本是 Ubuntu 24.04 ! # 1、下载 MinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio# 2、添加可执行权限 chmod x minio# 3、导出环境变量,用于设置账号密码,我设置的账号和密码都是 minioadmin export MI…

【数据结构练习题】Map与Set——1.只出过一次的数字2.复制带随机指针的链表3.宝石与石头4.坏键盘打字

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ ♥♥♥♥♥【数据结构练习题】堆——top-k问题♥♥♥♥♥ 文章目录 1.只出过一次的数字1.1问题描述1.2思路分析1.3绘图分析1.4代码实现2.复制带随机指针的链表2.1问题描述2.2思路分析2.3绘图分析2.4代…

Android解放双手的利器之ViewBinding

文章目录 1. 背景2. ViewBinding是什么3. 开启ViewBinding功能4. 生成绑定类5. 使用ViewBinding5.1Activity 中使用5.2 Fragment 中使用5.3 ViewHolder 中使用 6. ViewBinding的优点7. 与 dataBinding 对比 1. 背景 写代码最繁琐的是什么?重复的机械操作。我们刚接…

【AI+老照片焕新】母亲节用AI把时间的印记变成暖心礼物

想念是一张泛黄的照片,藏在抽屉里的笑容,总是那么亲切。今天是母亲节,是不是想给妈妈来点不一样的惊喜?用AI技术,把那些老照片瞬间焕新,让妈妈的青春记忆重放光华! 想象一下,妈妈年…

vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3

纯vue3的语法 一.创建(基于vite) 1.在指定目录下运行 npm create vuelatest 项目名称:英文小写下划线数字回车表示确定是、否 左右切换路由、pina、单元测试、端到端的测试、开启eslint控制代码质量 先选择no,学的时候自己手动…

4---自动化构建代码(逻辑梳理,轻松理解)

一、需求引出: 在使用编译器编译代码时,无论我们在一个项目中写了多少个文件(包括头文件、源文件),我们都可以一键完成编译,编译器会自动处理各个文件之间的包含,调用关系。但是在Linux中,我们在一个目录下…