深入理解Netty及核心组件使用—下

news2024/11/17 23:46:24

目录

ChannelHandler

ChannelHandler 接口

ChannelInboundHandler 接口

ChannelHandler 的适配器

Handler 的共享和并发安全性

资源管理和 SimpleChannelInboundHandler

Bootstrap

ChannelInitializer

ChannelOption


ChannelHandler

ChannelHandler 接口

        从开发人员的角度来看,Netty 的主要组件是 ChannelHandler,它充当了所有处理入站和出站数据的应用程序逻辑的容器。ChannelHandler 的方法是由网络事件触发的。事实上,ChannelHandler 可专门用于几乎任何类型的动作,例如将数据从一种格式转换为另外一种格式,例如各种编解码,或者处理转换过程中所抛出的异常。

Netty 定义了下面两个重要的 ChannelHandler 子接口:

ChannelInboundHandler——处理入站数据以及各种状态变化。

ChannelOutboundHandler——处理出站数据并且允许拦截所有的操作。


ChannelInboundHandler 接口

ChannelInboundHandler 接口方法:

channelRegistered 
当 Channel 已经注册到它的 EventLoop 并且能够处理 I/O 时被调用。

channelUnregistered 
当 Channel 从它的 EventLoop 注销并且无法处理任何 I/O 时被调用。

channelActive 
当 Channel 处于活动状态时被调用;Channel 已经连接/绑定并且已经就绪。

channelInactive 
当 Channel 离开活动状态并且不再连接它的远程节点时被调用。

channelReadComplete 
当 Channel 上的一个读操作完成时被调用。

channelRead 
当从 Channel 读取数据时被调用。

ChannelWritabilityChanged
    当 Channel 的可写状态发生改变时被调用。可以通过调用 Channel 的 isWritable()方法
来检测 Channel 的可写性。与可写性相关的阈值可以通过Channel.config().setWriteHighWaterMark()和 Channel.config().setWriteLowWaterMark()方法来设置。

userEventTriggered 
当ChannelnboundHandler.fireUserEventTriggered()方法被调用时被调用。

ChannelOutboundHandler 接口方法:

bind(ChannelHandlerContext,SocketAddress,ChannelPromise)
当请求将 Channel 绑定到本地地址时被调用

connect(ChannelHandlerContext,SocketAddress,SocketAddress,ChannelPromise)
当请求将 Channel 连接到远程节点时被调用

disconnect(ChannelHandlerContext,ChannelPromise)
当请求将 Channel 从远程节点断开时被调用

close(ChannelHandlerContext,ChannelPromise) 
当请求关闭 Channel 时被调用

deregister(ChannelHandlerContext,ChannelPromise)
当请求将 Channel 从它的 EventLoop 注销时被调用

read(ChannelHandlerContext) 
当请求从 Channel 读取更多的数据时被调用

flush(ChannelHandlerContext) 
当请求通过 Channel 将入队数据冲刷到远程节点时被调用

write(ChannelHandlerContext,Object,ChannelPromise) 
当请求通过 Channel 将数据写到远程节点时被调用

ChannelHandler 的适配器

       有一些适配器类可以将编写自定义的 ChannelHandler 所需要的工作降到最低限度,因为它们提供了定义在对应接口中的所有方法的默认实现。Netty 提供了抽象基类 ChannelInboundHandlerAdapter(处理入站) 和 ChannelOutboundHandlerAdapter(处理出站)。

        可以使用 ChannelInboundHandlerAdapter 和 ChannelOutboundHandlerAdapter 类作为自己的 ChannelHandler 的起始点。这两个适配器分别提供了 ChannelInboundHandler 和 ChannelOutboundHandler 的基本实现。通过扩展抽象类 ChannelHandlerAdapter,它们获得了它们共同的超接口 ChannelHandler 的方法。

       ChannelOutboundHandler 有个非常让人迷惑的 read 方法,这个 read 方法不是表示读数据,而是表示业务发出了读(read)数据的要求,这个要求也会封装为一个事件进行传播,这个事件 因为是业务发出到网络的,自然就是个出站事件,而且这个事件触发的就是 ChannelOutboundHandler 中 read 方法。

       如果我们的 Handler 既要处理入站又要处理出站可以使用类 ChannelDuplexHandler,也可以同时实现 ChannelOutboundHandler,ChannelInboundHandler 这两个接口。


Handler 的共享和并发安全性

       ChannelHandlerAdapter 还提供了实用方法 isSharable()。如果其对应的实现被标注为 Sharable,那么这个方法将返回 true,表示它可以被添加到多个 ChannelPipeline。

@ChannelHandler.Sharable
//在具体的处理器上打上该注解,在服务端引用的时候提前创建一个实例,可以在多个channel中引用该共享处理器

资源管理和 SimpleChannelInboundHandler

       Netty 在处理网络数据时,需要 Buffer,在 Read 网络数据时由 Netty 创建 Buffer,Write 网络数据时 Buffer 往往是由业务方创建的。不管是读和写,Buffer 用完后都必须进行释放,否则可能会造成内存泄露。

       在 Write 网络数据时,可以确保数据被写往网络了,Netty 会自动进行 Buffer 的释放,但是如果 Write 网络数据时,我们有 outBoundHandler 处理了 write()操作并丢弃了数据,没有继续往下写,要由我们负责释放这个 Buffer,就必须调用 ReferenceCountUtil.release 方法,否则就可能会造成内存泄露。所以 Netty 提供了一个特殊的被 称为 SimpleChannelInboundHandler 的 ChannelInboundHandler 实现。这个实现会在数据被 channelRead0()方法消费之后自动释放数据。

        同时系统为我们提供的各种预定义 Handler 实现,都实现了数据的正确处理,当我们自行编写业务 Handler 时,需要注意:数据要么继续传递,要么自行释放。


Bootstrap

        网络编程里,“服务器”和“客户端”实际上表示了不同的网络行为。换句话说,是监听传入的连接还是建立到一个或者多个进程的连接。因此,有两种类型的引导:一种用于客户端(简单地称为 Bootstrap),而另一种(ServerBootstrap)用于服务器。无论你的应用程序使用哪种协议或者处理哪种类型的数据,唯一决定它使用哪种引导类的是它是作为一个客户端还是作为一个服务器。

Bootstrap和ServerBootstrap区别:

1. ServerBootstrap 将绑定到一个端口,因为服务器必须要监听连接,而 Bootstrap 则是由想要连接到远程节点的客户端应用程序所使用的。

2. 引导一个客户端只需要一个 EventLoopGroup,但是一个 ServerBootstrap 则需要两个(也可以是同一个实例)。

       因为服务器需要两组不同的 Channel。第一组将只包含一个 ServerChannel,代表服务器自身的已绑定到某个本地端口的正在监听的套接字。而第二组将包含所有已创建的用来处理传入客户端连接(对于每个服务器已经接受的连接都有一个)的 Channel。

       与 ServerChannel 相关联的 EventLoopGroup 将分配一个负责为传入连接请求创建 Channel 的 EventLoop。一旦连接被接受,第二个 EventLoopGroup 就会给它的 Channel 分配一个 EventLoop。


ChannelInitializer

//Netty 提供了一个特殊的 ChannelInboundHandlerAdapter 子类
public abstract class ChannelInitializer<C extends Channel> ext ends
ChannelInboundHandlerAdapter

//定义了下面的方法:
protect ed abstract void initChannel(C ch) throws Exception;

       这个方法提供了一种将多个 ChannelHandler 添加到一个 ChannelPipeline 中的简便方法。你只需要简单地向 Bootstrap 或 ServerBootstrap 的实例提供你的 ChannelInitializer 实现即可,并且一旦 Channel 被注册到了它的 EventLoop 之后,就会调用你的initChannel()版本。在该方法返回之后,ChannelInitializer 的实例将会从 ChannelPipeline 中移除它自己。

之前案例中的:

    


ChannelOption

      

//通用 TCP 参数:
ChannelOption.SO_KEEPALIVE: 保持长连接,定期发送TCP保活包。
ChannelOption.TCP_NODELAY: 禁用 Nagle 算法,即禁用延迟发送。

//接收缓冲区和发送缓冲区大小:
ChannelOption.SO_RCVBUF: 设置接收缓冲区大小。
ChannelOption.SO_SNDBUF: 设置发送缓冲区大小。

//连接相关参数:
ChannelOption.CONNECT_TIMEOUT_MILLIS: 连接超时时间。
ChannelOption.SO_LINGER: 设置延迟关闭的时间,单位为秒。

//多路复用相关参数:
ChannelOption.SO_BACKLOG: 设置等待接受的连接队列大小。
ChannelOption.SO_REUSEADDR: 允许重用地址。
ChannelOption.SO_REUSEPORT: 允许多个Socket绑定到同一端口,一般用于实现负载均衡。

//其他:
ChannelOption.AUTO_READ: 如果为 true,则注册Channel的时候会自动创建并注册一个关联的ChannelHandlerContext,并调用 ChannelHandlerContext.read() 来开始读取数据。

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

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

相关文章

国产工业三防平板丨加固手持平板丨国产化加固平板有何优势?

随着科技的不断发展&#xff0c;三防产品已经逐渐成为人们生活、工作和娱乐中必不可少的一部分。而国产三防平板产品也在不断崛起&#xff0c;逐渐获得了消费者的认可和喜爱。相较于国外的三防平板产品&#xff0c;国产三防平板产品在技术和价格等方面具有一定的优势&#xff0…

游戏服务器租赁多少钱1个月?一年费用

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

转融通业务是什么?好处和弊端是什么?

转融通业务是指证券金融公司借入证券、筹得资金后&#xff0c;再转借给证券公司&#xff0c;为证券公司开展融资融券业务提供资金和证券来源&#xff0c;包括转融券业务和转融资业务两部分。从证券金融公司角度看&#xff0c;向证券公司提供资金和证券供其开展融资融券业务&…

*s是什么意思

&s是地址&#xff0c;*是指针&#xff0c;*&s是指指向&s地址的指针&#xff1b; j *&s 就是 j s的意思。 例如&#xff1a;readRawData( (char *)& rowCount, sizeof(qint16)); //读取文本流中的行数到rowCount、列数到colCount qint16 rowCount, col…

【成品论文】2024美赛B题完整成品论文23页+3小问matlab代码+数据集汇总

2024 年美国大学生数学建模竞赛&#xff08;2024 美赛&#xff09;B 题&#xff1a; 2024 MCM 问题 B: 搜寻潜水艇 题目翻译&#xff1a; Maritime Cruises Mini-Submarines (MCMS)是一家总部位于希腊的公司&#xff0c;专门制造能够携 带人类到达海洋最深处的潜水艇。潜水艇是…

电脑虚拟内存怎么设置?1分钟快速增加内存!

“我电脑里的内存好像不太够用&#xff0c;因此&#xff0c;我想在电脑里增加一些虚拟内存。不知道我应该怎么操作呢&#xff1f;有什么比较简单的此操作方法吗&#xff1f;” 虚拟内存是计算机系统内存管理的一种技术&#xff0c;它为程序提供了一个比实际物理内存更大的内存空…

Web课程学习笔记--CSS选择器的分类

CSS 选择器的分类 基本规则 通过 CSS 可以向文档中的一组元素类型应用某些规则 利用 CSS&#xff0c;可以创建易于修改和编辑的规则&#xff0c;且能很容易地将其应用到定义的所有文本元素 规则结构 每个规则都有两个基本部分&#xff1a;选择器和声明块&#xff1b;声明块由一…

Python老司机教你,花几分钟,构建一个Python包

1、前言 构建包的过程有些复杂&#xff0c;但从长远来看是值得的&#xff0c;尤其是可以创建属于自己的Python包。本文的目的是通过对构建一个新发行包的案例研究&#xff0c;让您了解需要构建什么以及如何构建python包的基础知识。 2、开始 首先&#xff0c;您肯定需要设置…

串行线路和静态路由配置

实验大纲 1.构建网络拓扑结构图 2.修改路由器名字 3.查看路由器的串行控制信息 4.配置R1和R2串行接口 5.测试连通性&#xff08;R1 PING R2 & R2 PING R1&#xff09; 6.配置路由器以太网口 7.配置主机信息 8.测试路由器连通性 9.查看路由信息 10.在R1配置静态路…

CentOS基于volatility2的内存取证实验

CentOS&#xff0c;Redhat和Fedora 都是Red Hat体系&#xff0c;采用yum管理器&#xff0c;不同于Debian、Ubuntu作为Debian体系使用apt 本文以CentOS为例&#xff0c;采用avml制作内存镜像&#xff0c;并利用volatility官方所给工具制作profile符号文件&#xff0c;进行简单的…

2024腾讯云游戏服务器租用多少钱一年?

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

[晓理紫]AI专属会议截稿时间订阅

AI专属会议截稿时间订阅 关注{晓理紫}&#xff0c;每日更新最新AI专属会议信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新AI专属会议信…

环境配置:Ubuntu18.04 ROS Melodic安装

前言 不同版本的Ubuntu与ROS存在对应关系。 ROS作为目前最受欢迎的机器人操作系统&#xff0c;其核心代码采用C编写&#xff0c;并以BSD许可发布。ROS起源于2007年&#xff0c;是由斯坦福大学与机器人技术公司Willow Garage合作的Switchyard项目。2012年&#xff0c;ROS团队从…

恒创科技:服务器内存不足影响大吗?

​  服务器在为网站、应用程序和在线服务提供支持方面发挥着关键作用。这些服务器需要提供最佳性能&#xff0c;以确保正常无缝的用户体验&#xff0c;而RAM是显著影响服务器性能的关键配置之一。 RAM 是一种随机存取存储器&#xff0c;计算机和服务器使用它来临时存储正在使…

OCR文本纠错思路

文字错误类别&#xff1a;多字 少字 形近字 当前方案 文本纠错思路 简单&#xff1a; 一、构建自定义词典&#xff0c;提高分词正确率。不在词典中&#xff0c;也不是停用词&#xff0c;分成单字的数据极有可能是错字&#xff08;少部分可能是新词&#xff09;。错字与前后的…

机器学习---半监督学习简单示例(标签传播算法)

1. 使用半监督学习方法 Label Spreading 在一个生成的二维数据集上进行标签传播 import numpy as np import matplotlib.pyplot as plt from sklearn.semi_supervised import label_propagation from sklearn.datasets import make_circles# generate ring with inner box n_s…

数学建模:数据相关性分析(Pearson和 Spearman相关系数)含python实现

相关性分析是一种用于衡量两个或多个变量之间关系密切程度的方法。相关性分析通常用于探索变量之间的关系&#xff0c;以及预测一个变量如何随着另一个变量的变化而变化。在数学建模中&#xff0c;这是常用的数据分析手段。   相关性分析的结果通常用相关系数来表示&#xff…

飞天使-k8s知识点12-kubernetes散装知识点1-架构有状态资源对象分类

文章目录 k8s架构图有状态和无状态服务 资源和对象对象规约和状态 资源的对象-资源的分类元数据型与集群型资源命名空间 k8s架构图 有状态和无状态服务 区分有状态和无状态服务有利于维护yaml文件 因为配置不同资源和对象 命令行yaml来定义对象对象规约和状态 规约 spec 描述…

时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-GRU-AdaBo…

微软为新闻编辑行业推出 AI 辅助项目,记者参加免费课程

2 月 6 日消息&#xff0c;微软当地时间 5 日发布新闻稿宣布与多家新闻机构展开多项基于生成式 AI 的合作。微软表示&#xff0c;其使命是确保新闻编辑室在今年和未来拥有创新。 目前建议企业通过微软官方合作伙伴获取服务&#xff0c;可以合规、稳定地提供企业用户使用ChatGP…