Netty通信框架
Netty框架的底层是NIO,NIO:non-blocking io 非阻塞IO
一个线程可以处理多个通道,减少线程创建数量;
读写非阻塞,节约资源:没有可读/可写数据时,不会发生阻塞导致线程资源的浪费
一、NIO三大组件
1.Channel&&Buffer
channel:
读写数据的双向通道,可以从channel将数据读入到buffer,也可以将buffer中的数据写入channel
buffer:
用来暂存数据的缓冲区
常见的channel有:
FileChannel - 文件传输的数据传输通道
DatagramChannel - UDP网络编程时的数据传输通道
SocketChannel - TCP网络编程时的数据传输通道 (客户端、服务器都能用)
ServerSocketChannel - TCP网络编程时的数据传输通道(专用于服务器)
二、Netty
Netty执行流程
Netty核心组件
1.Channel 数据通道:
数据的载体,建立客户端和服务端通信的桥梁,连接成功后保存Channel通道。
2.EventLoop 与 EventLoopGroup:
Netty为每个Channel分配一个EventLoop,EventLoop 本身只是一个线程驱动,在其生命周期内只会绑定一个线程,让该线程处理一个 Channel 的所有 IO 事件,起到在Channel中处理数据的功能
3.ServerBootstrap 与 Bootstrap:
Bootstrap 是客户端的引导类,Bootstrap 在调用 bind()(连接UDP)和 connect()(连接TCP)方法时,会新创建一个 Channel,仅创建一个单独的、没有父 Channel 的 Channel 来实现所有的网络交换。
ServerBootstrap 是服务端的引导类,ServerBootstarp 在调用 bind() 方法时会创建一个 ServerChannel 来接受来自客户端的连接,并且该 ServerChannel 管理了多个子 Channel 用于同客户端之间的通信。
Bootstrap来设置一些连接参数
4.ChannelHandler 与 ChannelPipeline:
ChannelHandler是消息处理器,封装在了ChannelPipeline对象中
ChannelPipeline来添加一些特定的处理器满足业务需求
5.ChannelFuture:
Netty 中所有的 I/O 操作都是异步的,即操作不会立即得到返回结果,所以Netty定义了ChannelFuture来作为操作返回结果
public Channel connect(String host , int port , ChannelInboundHandlerAdapter handler, MessageToMessageEncoder encoder, ByteToMessageDecoder decoder) {EventLoopGroup group = getEventLoopGroup();bootstrap = new Bootstrap();bootstrap.group(group);bootstrap.channel(NioSocketChannel.class);bootstrap.option(ChannelOption.TCP_NODELAY, true); // 立即发送数据,设置了TCP_NODELAY选项为true,它的作用是禁用了Nagle算法。这意味着数据将被立即发送,不会等待小的数据块进行合并。bootstrap.option(ChannelOption.SO_KEEPALIVE, false); // 用于控制操作系统是否发送保持活动(keep-alive)探测报文段来检测连接是否仍然活跃bootstrap.option(ChannelOption.ALLOW_HALF_CLOSURE, false); // 全关闭(Full Closure):表示双方都关闭了连接,不再允许进行数据的读写操作。// 半关闭(Half Closure):表示一端关闭了连接,但另一端仍可以发送数据。// 当设置为true时,表示允许半关闭连接,即当远程端关闭连接时,本地端仍可以继续发送数据。bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000); //连接超时毫秒数bootstrap.option(ChannelOption.SO_RCVBUF, 64 * 1024); //TCP数据接收缓冲区大小bootstrap.option(ChannelOption.SO_SNDBUF, 46 * 1024); //TCP数据发送缓冲区大小// bootstrap.handler(new LoggingHandler(LogLevel.DEBUG));channelInitializer = new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline channelPipeline = ch.pipeline();// channelPipeline.addLast(new LoggingHandler(LogLevel.DEBUG));channelPipeline.addLast("decoder", decoder);channelPipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));channelPipeline.addLast("encoder", encoder);channelPipeline.addLast("handler", handler);}};bootstrap.handler(channelInitializer);try {ChannelFuture channelFuture = bootstrap.connect(host, port).syncUninterruptibly();if (channelFuture != null && channelFuture.isSuccess()) {logger.info("connect tcp server host = {}, port = {} success", host, port);return channelFuture.channel();} else {logger.error("connect tcp server host = {}, port = {} fail", host, port);}} catch (Exception e) {logger.error("connect to tcp server failed.", e);}return null;}
ChannelInboundHandlerAdapter
、MessageToMessageEncoder
和ByteToMessageDecoder
分别是Netty框架中的三个重要类,用于处理网络数据的编解码和处理。
-
ChannelInboundHandlerAdapter
是Netty中用于处理入站数据的抽象类。它提供了一系列的回调方法,可根据实际需求进行重写,用于处理不同的入站事件和操作。通常情况下,我们的自定义处理器需要继承该类,并且实现自定义的业务逻辑。 -
MessageToMessageEncoder
是一个编码器,用于将一种消息类型转换为另一种消息类型。它将一个出站消息对象转换为另一个出站消息对象,例如将一个POJO对象编码为字节数据。通过继承该抽象类并重写encode()
方法,我们可以实现自定义的消息编码逻辑,以满足特定的协议或需求。 -
ByteToMessageDecoder
是一个解码器,用于将字节数据解码为其他形式的数据,如将字节数据解码为POJO对象或其他自定义消息对象。它将一个入站的字节缓冲区转换为出站消息对象。通过继承该抽象类并重写decode()
方法,我们可以根据实际需求实现自定义的消息解码逻辑,以满足特定的协议或需求。
这三个类在Netty中的应用通常是组合使用的,用于构建完整的网络数据处理链。具体来说,ChannelInboundHandlerAdapter
用于处理入站数据的不同事件和操作,MessageToMessageEncoder
用于将出站消息对象编码为其他形式的消息对象,而ByteToMessageDecoder
用于将入站的字节数据解码为其他形式的消息对象。通过灵活组合和重写这些类的方法,我们可以实现定制的网络数据处理逻辑。
其中ChannelInitializer
是一个用于初始化 SocketChannel
的抽象类。它的 initChannel()
方法会在每个新连接被接受时调用,用于配置该连接的 ChannelPipeline。
在 initChannel()
方法中,我们可以通过 channelPipeline
对象来设置和添加各种处理器(handlers)到 ChannelPipeline 中,以定义数据的处理流程。
在这段代码中,通过 channelPipeline
对象按照一定的顺序添加了以下处理器:
decoder
:这是一个ByteToMessageDecoder
,用于将入站的字节数据解码为其他形式的消息对象。StringDecoder
:这是一个 Netty 提供的内置解码器,用于将入站的字节数据解码为字符串形式的消息对象。指定编码格式为UTF-8
。encoder
:这是一个MessageToMessageEncoder
,用于将出站消息对象编码为其他形式的消息对象。handler
:这是一个自定义的ChannelInboundHandlerAdapter
,用于处理入站数据的不同事件和操作。
通过这样的方式,我们可以构建一个完整的数据处理流程,根据实际需求来解码、编码和处理网络消息。在 ChannelInitializer
的 initChannel()
方法中,我们可以按照需求自由添加或修改处理器,以满足特定的业务需求。
ChannelFuture channelFuture = bootstrap.connect(host, port).syncUninterruptibly();
这段代码是使用 bootstrap
对象创建一个客户端连接,并返回一个 ChannelFuture
对象。
以下是代码的执行步骤:
bootstrap.connect(host, port)
:使用指定的主机和端口号,创建一个连接到目标服务器的操作,并返回一个ChannelFuture
对象。.syncUninterruptibly()
:阻塞当前线程,等待连接操作完成。syncUninterruptibly()
方法会阻塞当前线程,直到连接操作完成或发生异常,而不会响应中断。channelFuture
:连接操作完成后,返回一个ChannelFuture
对象,可以通过该对象获取操作的结果。
通过这段代码,可以同步地创建一个客户端连接,并在连接操作完成后获取连接的 ChannelFuture
对象,以便后续的操作和处理。
相关文章:

Netty通信框架
Netty框架的底层是NIO,NIO:non-blocking io 非阻塞IO 一个线程可以处理多个通道,减少线程创建数量; 读写非阻塞,节约资源:没有可读/可写数据时,不会发生阻塞导致线程资源的浪费 一…...

6西格玛质量标准: 提升业务效率的关键
在现代竞争激烈的商业环境中,企业需要不断提高效率,降低成本,同时确保产品和服务的质量。为了达到这个目标,许多企业已经转向了6西格玛质量标准。这个方法旨在通过最小化缺陷和提高流程稳定性来优化业务运作,为客户提供…...

OpenGL ES相关库加载3D 车辆模型
需求类似奇瑞的这个效果,就是能全方位旋转拖拽看车,以及点击开关车门车窗后备箱等 瑞虎9全景看车 (chery.cn) 最开始收到这个需求的时候还有点无所适从,因为以前没有做过类似的效果,后面一经搜索后发现实现的方式五花八门…...

云原生环境下JAVA应用容器JVM内存如何配置?—— 筑梦之路
Docker环境下的JVM参数非定值配置 —— 筑梦之路_docker jvm设置-CSDN博客 之前简单地记录过一篇,这里在之前的基础上更加细化一下。 场景说明 使用Java开发且设置的JVM堆空间过小时,程序会出现系统内存不足OOM(Out of Memory)的…...

防雷接地测试方法完整方案
防雷接地是保障电力系统、电子设备和建筑物安全的重要措施,防雷接地测试是检验防雷接地装置是否合格的必要手段。本文介绍了防雷接地测试的原理、方法和注意事项,以及如何编写防雷接地测试报告。 地凯科技防雷接地测试的原理 防雷接地测试的基本原理是…...

【云原生-K8s】Kubernetes安全组件CIS基准kube-beach安装及使用
基础介绍kube-beach介绍kube-beach 下载百度网盘下载wget下载 kube-beach安装kube-beach使用基础参数示例结果说明 基础介绍 为了保证集群以及容器应用的安全,Kubernetes 提供了多种安全机制,限制容器的行为,减少容器和集群的攻击面…...

玩家必备,2款顶级游戏录屏软件!
“游戏怎么录屏呀?最近迷上了网游,觉得自己的游戏技术挺厉害的,想把游戏视频录下来出一个教程,方便给朋友进行参考,但是我不会录屏,大家有没有游戏录屏的软件或者方法推荐一下。” 随着游戏产业的飞速发展…...

七、W5100S/W5500+RP2040树莓派Pico<UDP 组播>
文章目录 1. 前言2. 相关简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP 组播回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP组播是一种基于UDP协议的通信方式,它允许一台计算机通过发送单…...

Wonder3D:用单张图片生成纹理网格
Wonder3D 只需 2 ∼ 3 分钟即可从单视图图像重建高度详细的纹理网格。 Wonder3D首先通过跨域扩散模型生成一致的多视图法线图和相应的彩色图像,然后利用新颖的法线融合方法实现快速、高质量的重建。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 1、推理准…...

macOS 创建Flutter项目
参考在 macOS 上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 这个文档,配置好flutter的环境 编辑器可以选择vscode或者IDEA。 我这里以IDEA为例 打开 IDE 并选中 New Flutter Project。 选择 Flutter,验证 F…...

【微服务 Spring Cloud Alibaba】- Nacos 服务注册中心
目录 1. 什么是注册中心? 1.2 注册中心的作用 2. SpringBoot 整合 Nacos 实现服务注册中心 2.1 将服务注册到 Nacos 2.2 实现消费者 3. 服务列表各个参数的含义、作用以及应用场景 1. 什么是注册中心? 注册中心是微服务架构中的一个重要组件&…...
windows openssl安装和基本使用
OpenSSL使用 私钥和证书文件 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365这是一个使用OpenSSL命令行工具生成自签名X.509证书的命令。通过执行该命令,您将生成一个4096位RSA密钥对,并使用该密钥对生成一个自…...

Qt Concurrent框架详解(QFuture、QFutureWatcher)
1.概述 Qt Concurrent是Qt提供的一个并发编程框架,用于简化多线程和并行计算的开发。它提供了一组易于使用的函数和类,可以方便地在多线程环境下处理并发任务。 有以下特点: 简单易用:Qt Concurrent提供了一组高级函数和类&…...
zip函数用法:解压与打包
解释 在 Python 中,zip 函数可以用于两种情况:打包(压缩)和解压(解包)。 1.打包(压缩): 当传递多个可迭代对象作为参数给 zip 函数时,它会将这些可迭代对象…...
这一份免费API接口集合,开发者必备
台风信息查询:提供西北太平洋及南海地区过去两年及当前年份所有编号台风的信息查询,包括台风实时位置、过去路径、预报路径及登陆信息等要素。未来7天生活指数:支持国内3400个城市以及国际4万个城市的天气指数数据,包括晨练、洗车…...

【IDEA】设置sql提示
第一步:注入SQL语言 1.首先选择任意一条sql语句,右击,选择 ‘显示上下文操作’ 2.选择 ‘注入语言或引用’ 3. 往下翻,找到MySQL 第二步:配置MySQL数据库连接 1.首先点击侧边的数据库,再点击上面的加号 2…...

Swagger + DOCWAY 一步导出为优雅完整的Markdown、Pdf接口文档
只要开发,只要写接口应该没人不知道Swagger,但DOCWAY可能知道的人不多,但知道用过后就离不开了,不管是作为多方联调的接口文档,还是交接给客户的文档,都是可以的,具体如何使用,详细步…...

HTML链接、头部
HTML链接: HTML使用超级链接与网络上的另一个文档相连。HTML中的链接是一种用于在不同网页之间的导航的元素。链接通常用于将一个网页与另一个网页或资源(文档、图像、音频文件等)相关联。链接允许用户在浏览网页时单击文本或图像来跳转到其他…...

IDEA优雅自动生成类注释和快捷键生成方法注释
生成类注释 Preferences->Editor->File and Code Templates-> Includes ->File Header 注释模板: /*** Classname ${NAME}* Description ${description}* Date ${DATE} ${TIME}* Created by ZouLiPing*/生成方法和字段注释 查看IDEA自动配置java快捷…...

数据库面试题整理
目录 MySQL事务隔离级别有哪几种?MySQL的常用的存储引擎有哪些?特点是什么,分别适合什么场景下使用MySQL有数据缓存吗?原理是怎么样的?InnoDB的缓冲池默认是开启的吗?基本原理是什么?会有脏数据…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...