Netty数据传输载体ByteBuf

news/2024/10/3 17:13:04

原文链接:https://www.cnblogs.com/wuweishuo/p/10854421.html

Netty中读写以ByteBuf为载体进行交互

ByteBuf的结构

  1. ByteBuf以readerIndex和writerIndex划分为三块区域,废弃字节,可读字节,可写字节。每次从ByteBuf读取一个字节时readerIndex+1,写入一个字节时writerIndex+1。
  2. 废弃字节,这部分的数据是无效的,范围为0~readerIndex-1
  3. 可读字节,从ByteBuf读取的数据都来自这块区域,范围为readerIndex~writerIndex-1,当readerIndex与writerIndex相等时不可读。
  4. 可写字节,写入的数据存放的区域,范围为writerIndex~capacity,当capacity与writerIndex相等时不可写,但是ByteBuf还有一个maxCapacity,容量不足时可以进来扩容,当容量超过maxCapacity时会报错。

读取

	ByteBuf byteBuf = Unpooled.copiedBuffer("hello world".getBytes());//判断是否有可读的字节System.out.println(byteBuf.isReadable());//返回可读字节数System.out.println(byteBuf.readableBytes());//返回当前的读指针System.out.println(byteBuf.readerIndex());while (byteBuf.isReadable()) {//以read开头的方法都是读取方法,readInt、readBoolean等byteBuf.readByte();}System.out.println(byteBuf.readerIndex());//设置读指针byteBuf.readerIndex(0);//将当前可读数据都读取到byte[]中byteBuf.readBytes(new byte[byteBuf.readableBytes()]);

写入

	//分配capacity为9,maxCapacity为12的byteBufByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(9, 12);//返回可写字节数System.out.println(byteBuf.writableBytes());//判断是否可写System.out.println(byteBuf.isWritable());//以write开头的都是写入方法byteBuf.writeByte(1);byteBuf.writeInt(1);byteBuf.writeBytes(new byte[]{1,2,3,4});//获取写指针System.out.println(byteBuf.writerIndex());//这时writerIndex==capacitySystem.out.println(byteBuf.writableBytes());System.out.println(byteBuf.isWritable());//再写入将扩容byteBuf.writeByte(1);System.out.println(byteBuf.isWritable());System.out.println(byteBuf.writableBytes());//扩容后仍然不足存放将报错//byteBuf.writeInt(1);//设置写指针byteBuf.writerIndex(0);System.out.println(byteBuf.isWritable());System.out.println(byteBuf.writableBytes());byteBuf.writeInt(1);

引用计数

release() 与 retain()
  1. netty使用的是堆外内存,不被jvm管理,所以需要我们手动释放。
  2. netty使用引用计数管理ByteBuf,如果没有地方引用一个ByteBuf,将直接回收底层内存。
  3. 一个ByteBuf被创建时引用为1,retain()将使引用+1,release()使引用-1,为0时将被回收。
  4. 一般遵循谁retain()(包括创建)谁release()

slice()、duplicate()、copy()

  1. slice()截取可读字节区域返回,新的ByteBuf的maxCapacity为旧的readableBytes(),但底层内存和引用共用
  2. duplicate()为ByteBuf的浅拷贝,读写指针与旧的无关,但底层内存和引用共用
  3. copy()为深拷贝,读写指针、引用和内存都无关
  4. slice()和duplicate()不会增加引用计数,而retainedSlice() 与 retainedDuplicate()会增加计数。

参考资料

Netty实战
Netty 入门与实战:仿写微信 IM 即时通讯系统

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

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

相关文章

【jmeter】测试redis读取性能(单机)

一、场景公司对redis节点进行增加,需要验证节点增加后,对于redis本身性能及服务性能的影响二、 使用工具 jmeter redis data set插件 Documentation: https://jmeter-plugins.org/wiki/RedisDataSet/ 缺点: 1、只支持单机 2、只支持List和Set类型三、安装 可用插件搜索安装即…

k8s存储CSI插件的存储方案

Kubernetes从1.9版本开始引入容器存储接口 Container Storage Interface (CSI)机制,用于在Kubernetes和外部存储系统之间建立一套标准的存储管理接口,通过该接口为容器提供存储服务。 CSI的核心组件和部署架构 Kubernetes CSI存储插件的关键组件和推荐的容器化部署架构如下(…

12款高效开源Wiki系统推荐,打造团队知识管理利器

在企业知识管理和团队协作中,Wiki系统因其强大的编辑和组织功能,逐渐成为一种重要的工具。文章介绍了12款好用的开源Wiki:PingCode、DokuWiki、MediaWiki、Tiki Wiki CMS Groupware、XWiki、BookStack、PMWiki、Foswiki、GitBook、Wiki.js、TiddlyWiki、Slite。以及对比了一…

C# 每次生成之后自动更新软件版本号

第一步:在解决方案资源管理器中找到【AssemblyInfo.cs】文件,修改版本生成方式:[assembly: AssemblyVersion("1.0.0.*")] // 程序集的版本信息由下列四个值组成: // // 主版本 // 次版本 // 生成号 // 修订号 // //可以指定所有这些值,也可…

在Python中使用LSTM和PyTorch进行时间序列预测|附代码数据

全文链接:http://tecdat.cn/?p=8145 最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出。 顾名思义,时间序列数据是一种随时间变化的数据类型。例如,24小时内的温度,一个月内各种产品的价格,一年中特定公司的股票价格 诸如长期短期记忆网络(LSTM)之类…

蒸发温差热机-大号尺寸饮水鸟发电应用原理详细分析

蒸发温差热机-大号尺寸饮水鸟发电应用原理详细分析 作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流饮水鸟是一种热机,它利用温差将热能转换为设备内的压差,并执行机械做功。像所有热机一样,饮水鸟通过热力学循…

KC81710H 电池BMS AFE 规格书解读

1.工作模式 Full Power,Normal Sleep,Deep Sleep,Shut DownNormal Sleep 内部工作状态完全和 Full Power 模式一样,只是降低了 auto scan 的频率,Deep Sleep 在 Deep Sleep 模式下,充放电MOS 被强制关闭,ADC1 和ADC2(取决sw_cc_md[1:0]的配置)和其它功能模块都被强制关闭…

零售业上云为什么首选谷歌云

零售业是国民经济的重要组成部分,在促进经济发展、改善人民生活水平方面发挥着重要作用。零售业也是一个竞争激烈的行业,零售企业需要不断创新经营方式、提高服务质量才能在竞争中立于不败之地。零售业是国民经济的重要组成部分,在促进经济发展、改善人民生活水平方面发挥着…