Netty 常见组件介绍

Netty 常见组件介绍

上篇文章Netty入门程序echo 基本包含了Netty常见的组件,本文分别介绍各个组件

  • Bootstrap or ServerBootstrap
  • EventLoop
  • EventLoopGroup
  • ChannelPipeline
  • Channel
  • Future or ChannelFuture
  • ChannelInitializer
  • ChannelHandler

Bootstrap vs ServerBootstrap

Bootstrap

Bootstrap 主要用于客户端的配置,它主要用于创建一个连接到远程服务器的客户端应用程序

它允许你设置以下内容

  • EventLoopGroup
  • Channel
  • ChannelInitializer 用来配置新创建的通道的 ChannelPipeline。
 Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast("decoder", new StringDecoder());ch.pipeline().addLast("encoder", new StringEncoder());ch.pipeline().addLast(new ClientHandler());}});// 连接到服务器ChannelFuture f = b.connect(host, port).sync();

ServerBootstrap

ServerBootstrap 是专门用于配置和启动服务端通道的工具类。
它用于创建一个能够监听指定端口,接收客户端连接并处理客户端请求的服务器应用程序

ServerBootstrap还需要配置
childHandler 服务端会为每个客户端连接创建一个新的通道,childHandler方法用于添加处理这些客户端通道事件的ChannelHandler。

ServerBootstrap 需要两个 EventLoopGroup,一个用于接受连接
另一个用于处理 IO读写操作,而Bootstrap只需要指定一个EventLoopGroup用于处理IO读写操作

 EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast("decoder", new StringDecoder());ch.pipeline().addLast("encoder", new StringEncoder());ch.pipeline().addLast(new ServerHandler());}});ChannelFuture f = b.bind(port).sync();

Channel

Channel 在 Netty 中是对网络 I/O 操作的抽象。它代表了一个网络连接或者通信管道,可以是服务器端用于监听客户端连接的通道,也可以是客户端用于连接服务器的通道。

  • NioSocketChannel

基于 Java NIO 的 Socket 通道,主要用于客户端建立 TCP 连接。前面Bootstrap客户端代码片段使用的就是NioSocketChannel

  • NioServerSocketChannel

同样基于 Java NIO,用于服务器端监听 TCP 端口,等待客户端的连接请求。前面ServerBootstrap代码片段使用的就是NioSocketChannel

  • EpollSocketChannel 和 EpollServerSocketChannel(适用于 Linux)

这两种通道是基于 Linux 的 epoll 机制实现的。
EpollSocketChannel用于客户端连接,EpollServerSocketChannel用于服务器监听

  • OioSocketChannel 和 OioServerSocketChannel(基于旧的阻塞 I/O)

这是基于传统的阻塞式 I/O 实现的通道,使用的比较少,通常我们使用NIO,都使用Netty,还用阻塞IO,小编实在编不出有什么合适的理由。

ChannelPipeline

ChannelPipeline 是 Netty 中的一个核心组件,它是一个ChannelHandler 的责任链,负责处理所有的入站事件(读)和出站事件(写)。 无论服务端还是客户端都可能要处理读写事件,因为本质建立在TCP链接基础上,是全双工的。

ChannelPipeline无论在服务端还是客户端,它的设置都非常重要。

ChannelPipeline 包含着一系列的 ChannelHandler,服务端/客户端按照ChannelHandler顺序来处理 IO 事件,它的顺序非常重要。

事件处理顺序

责任链中隐含两个Handler,一个Header,一个是Tail,这两个非常重要,本文先点到为止。

加上Header和Tail用户向ChannelPipeline中添加的ChannelHandler1,ChannelHandler2,…,ChannelHandlerN ; 按顺序处理出站/入站事件。

入站事件顺序

入站事件从 ChannelPipeline 的头部开始,向尾部传播

Header -> ChannelHandler1 -> ChannelHandler2 -> … -> ChannelHandlerN -> Tail

出站事件顺序

出站事件则从ChannelPipeline尾部开始,向头部传播。

Tail -> ChannelHandlerN -> … -> ChannelHandler2 -> ChannelHandler1 -> Header

只有理解了ChannelPipeline的处理顺序,我们才能正确的设置责任链上 ChannelHandler,才能正确的处理对应事件。

ChannelInitializer

ChannelInitializer 是 Netty 中一个非常重要的组件, 它就像是一个 ChannelPipeline 的构建器

ChannelFuture

jdk线程池异步执行需要返回结果的 通常返回的是Future,
ChannelFuture 接口继承 Future,
ChannelFuture 是 Netty 中用于表示一个异步操作结果的接口。在 Netty 中,许多 I/O 操作(如连接建立、数据写入、绑定端口等)都是异步执行的。

ChannelHandler

ChannelHandler 是 Netty 中用于处理 Channel 事件的核心组件。它是一个接口,定义了一系列方法来处理各种网络 I/O 事件,
如数据读取、写入、连接建立和关闭等。可以把 ChannelHandler 看作是一个事件处理器

  • ChannelInboundHandler:
    处理入站事件,如连接建立、数据接收、异常捕获等。
    常见实现:SimpleChannelInboundHandler, ChannelInboundHandlerAdapter

  • ChannelOutboundHandler:
    处理出站事件,如绑定、连接、写入数据等。
    常见实现:ChannelOutboundHandlerAdapter

  • ChannelDuplexHandler:
    同时处理入站和出站事件。
    常见实现:ChannelDuplexHandler

上面列的几个类比较底层,Netty 内置了许多ChannelHandler ,如果使用Netty开发某些功能肯定会打交道,我们只需要专学处理消息的读写即可。以下列举几个典型的后续大部分都会接触。

  • ByteToMessageDecoder

它是一个抽象类,它实现了 ChannelInboundHandler 接口,底层将数据读到ByteBuf中,我们需要将ByteBuf 转换为业务对象,再传递给后续处理器处理。

与之相对应的是MessageToByteEncoder ,将业务消息对象编码为"ByteBuf",再发送给客户端(出站事件)

StringDecoder 和 StringEncoder 就是对应的实现类。 我们基于ByteToMessageDecoder也能实现内置的处理器的能力

public class MyByteToMessageDecoder extends ByteToMessageDecoder {@Overrideprotected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {msg = doDecode(in);out.add(msg);}}

其他高级的内置处理器,我们在处理半包,粘包问题可以结合使用。

  • DelimiterBasedFrameDecoder

基于分隔符的解码器,用于处理以特定字符或字符序列分隔的消息。适用于消息以特定字符分隔的场景。 能够处理TCP 半包问题

  • LineBasedFrameDecoder

基于行的解码器,用于处理以换行符分隔的消息。适用于消息以换行符分隔的场景。可以看成是特殊的基于分隔符的解码器

  • FixedLengthFrameDecoder
    固定长度的帧解码器,用于处理固定长度的消息。适用于消息长度固定的场景。能够处理TCP 半包问题

总结

Netty 组件看上去很多,实际上我们通常只需要关注 消息解码、编码 和读写事件的处理,这也是选择Netty 原因,简单同时兼顾性能。

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

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

相关文章

el-talble selection行 初始默认勾选

导言 el-talble selection 行&#xff08;选择列&#xff09;用于显示复选框&#xff0c;让用户可以选择或取消选择某些表格行&#xff0c;常用于批量操作场景。 刚刚试了下&#xff0c;想加深印象记录一下当学习碎片。参考的是表格多选并根据每行值初始化选中状态&#xff08;…

HTML 块级元素和内联(行内)元素详解

在 HTML 中,元素根据它们在页面中的表现方式分为两类:块级元素 和 内联元素(行内元素)。了解块级元素和内联元素的特性与使用方法,是掌握HTML开发的重要基础。本文将深入探讨这两类元素的特点及其在实际开发中的应用。 文章目录 一、块级元素1.1 块级元素是什么?1.2 块级…

使用Docker构建和部署微服务

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 [TOC] Docker 是一个开源的容器化平台&#xff0c;可以帮助开发者轻松构建、打包和部署应用程序。本文将详细介绍如何使用 Dock…

conda下jupyterlab安装问题以及交互绘图问题记录

安装 1. 直接conda install jupyterlab就好&#xff0c;只要在base环境下安装就行&#xff0c;可以在任意环境下执行jupyter lab启动。 2. 打开jupyter lab后显示Could not determine jupyterlab build status without nodejs&#xff0c;可以执行conda install nodejs安装no…

springcloud整合sentinel,限流策略持久化到nacos,详细配置案例

目录 1.组件下载和启动 &#xff08;1&#xff09;sentinel-dashboard下载 &#xff08;2&#xff09;nacos下载 &#xff08;3&#xff09;jmeter下载 &#xff08;4&#xff09;redis下载&#xff08;与流控关系不大&#xff0c;与项目启动有关&#xff09; 2.本微服务项…

【ONLYOFFICE 文档 8.2 版本深度测评】功能革新与用户体验的双重飞跃

引言 在数字化办公的浪潮中&#xff0c;ONLYOFFICE 文档以其强大的在线协作功能和全面的办公套件解决方案&#xff0c;赢得了全球用户的青睐。随着 8.2 版本的发布&#xff0c;ONLYOFFICE 再次证明了其在办公软件领域的创新能力和技术实力。 一.协作编辑 PDF&#xff1a;团队合…

Java爬虫:在1688上“照片快递”上传图片

想象一下&#xff0c;你是一名快递小哥&#xff0c;不过你送的不是包裹&#xff0c;而是图片——而且是用Java编写的爬虫作为你的快递车&#xff0c;将图片快速准确地送到1688的服务器上。今天&#xff0c;我们将一起化身为代码界的“照片快递”&#xff0c;使用Java爬虫技术&a…

深入探索ReentrantLock(三):限时锁申请的艺术

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 前言 一、ReentrantLock限时锁申请 1.限时锁申请的必要性 2.tryLock(long time, TimeUnit unit) 方法讲解 3.限时锁的优势与注意事项 4.tryLock(long time, TimeUnit unit)案例 总结 前言 Java并…

初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 wait、notify 方法 多线程练习 单例模式 饿汉模式 懒汉模式 指令重排序 wait、notify 方法 wait 和 我们前面学习的sleep…

在线预览 Word 文档

引言 随着互联网技术的发展&#xff0c;Web 应用越来越复杂&#xff0c;用户对在线办公的需求也日益增加。在许多业务场景中&#xff0c;能够直接在浏览器中预览 Word 文档是一个非常实用的功能。这不仅可以提高用户体验&#xff0c;还能减少用户操作步骤&#xff0c;提升效率…

C++ 优先算法 —— 查找总价格为目标值的两个商品(双指针)

目录 题目 &#xff1a;查找总价格为目标值的两个商品 1. 题目解析 2. 算法原理 Ⅰ 暴力枚举 Ⅱ 双指针算法 3. 代码实现 暴力枚举 双指针算法 题目 &#xff1a;查找总价格为目标值的两个商品 1. 题目解析 题目截图&#xff1a; 这道题的一个关键的地方&#xff0c;它先…

Qt QCheckBox、QPushButton和QRadioButton详解

QCheckBox&#xff08;复选框&#xff09; 功能&#xff1a;QCheckBox用于创建一个复选框控件&#xff0c;允许用户从多个选项中选择多个。 属性&#xff1a; checkable&#xff1a;决定复选框是否可以被选中或取消选中。checked&#xff1a;表示复选框当前的选中状态&#…

自编以e为底的指数函数exp,性能接近标准库函数

算法描述&#xff1a; (1). 先做自变量x的范围检查&#xff0c;对于双精度浮点数&#xff0c;自变量不能超出(-1022ln2, 1024ln2)(-708.39, 709.78)&#xff0c;否则exp(x)会溢出。对于单精度浮点数&#xff0c;自变量不能超出(-126ln2, 128ln2)(-87.33, 88.72). 自己使用此函数…

数据结构-二叉树中的递归

目录 前言 简单手撕二叉树 二叉树节点的求解 二叉树叶子节点的求解 二叉树高度 二叉树第K层节点的个数 二叉树查找值为X的节点 结束语 前言 在这里说声抱歉&#xff0c;好久没更新数据结构了&#xff0c;二叉树的相关内容还没有更新完&#xff0c;是小编的失职&#xff…

在基于AWS EC2的云端k8s环境中 搭建开发基础设施

中间件下载使用helm,这里部署的都是单机版的 aws-ebs-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:name: aws-ebs-storageclass provisioner: kubernetes.io/aws-ebs parameters:type: gp2 # 选择合适的 EBS 类型&#xff0c;如 gp2、io1…

2024网鼎杯青龙组wp:Crypto1

题目 附件内容如下 from Crypto.Util.number import * from secret import flag from Cryptodome.PublicKey import RSAp getPrime(512) q getPrime(512) n p * q d getPrime(299) e inverse(d,(p-1)*(q-1)) m bytes_to_long(flag) c pow(m,e,n) hint1 p >> (51…

Golang | Leetcode Golang题解之第528题按权重随机选择

题目&#xff1a; 题解&#xff1a; type Solution struct {pre []int }func Constructor(w []int) Solution {for i : 1; i < len(w); i {w[i] w[i-1]}return Solution{w} }func (s *Solution) PickIndex() int {x : rand.Intn(s.pre[len(s.pre)-1]) 1return sort.Searc…

3D打印机 屏幕的固定挂钩断后的一次自己修复经历

引子 3D打印机的屏幕固定挂钩断了 这次确实不知道咋断的&#xff0c;这可咋办呢&#xff0c;到网上看了一下&#xff0c;一个屏幕要2佰多&#xff0c;有些小贵&#xff0c;要不就自己修修吧&#xff0c;打个挂钩按上&#xff0c;说干就干。 正文 freecad的设计图如下【其中各…

PHP合成图片,生成海报图,poster-editor使用说明

之前写过一篇使用Grafika插件生成海报图的文章&#xff0c;但是当我再次使用时&#xff0c;却发生了错误&#xff0c;回看Grafika文档&#xff0c;发现很久没更新了&#xff0c;不兼容新版的GD&#xff0c;所以改用了intervention/image插件来生成海报图。 但是后来需要对海报…

Java基于微信小程序的美食推荐系统(附源码,文档)

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…