【闪电侠学netty】第7章 数据载体ByteBuf的介绍
【Netty】读书笔记 - 跟闪电侠学netty
1. 内容概要
1.1 总结
1.1.1 内存管理
Netty 使用的是堆外内存,需要手动释放,使用引用计数的方式管理内存,当引用计数 =0,回收ByteBuf 底层内存
原则:谁使用retain() , 谁释放release()
1.1.2 创建ByteBuf的方式
- ByteBuf buffer = ctx.alloc().buffer(); (第6章,P41)
- ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(9, 100);(第7章,P49)
- ByteBuf buffer = ByteBufAllocator.DEFAULT.ioBuffer();(第8章,P59)
- ByteBuf buffer = ctx.alloc().ioBuffer();(第9章 csdn)
其中
ctx 为 ChannelHandlerContext 通道处理上下文对象
ctx.alloc() 返回 ByteBufAllocator ByteBuf的分配器
2. 课程内容
1 ByteBuf 的结构
- ByteBuf 容器 - 当前容量 capacity = 已废弃的字节 + 可读字节 + 可写字节
- ByteBuf 容器 - 最大容量 maxCapacity = capacity + 可扩容字节
- 被读写指针划分三部分
- 从指针开始的地方读写,读写之间相互没有冲突
- 已废弃的字节(通常为0)
1.1 readerIndex
- 读指针,从0开始
- ByteBuf 中每读一个字节,readerIndex自增1
- 可读字节数 = writerIndex - readerIndex , 所以writeIndex = readerIndex,ByteBuf 不可读
1.2 writerIndex
- 写指针,从0开始
- ByteBuf中每写一个字节,writerIndex自增1,直到 capacity
- 可写字节数 = capacity - writeIndex
1.3 扩容
- ByteBuf 写数据,容量不足就会自动扩容
- capacity 扩容到 maxCapacity
- 超过maxCapacity会报错
2 常用 API
API类别 | 名称 | 使用 |
容量 | capacity() | 当前ByteBuf容量 capacity = 已废弃的字节 + 可读字节 + 可写字节 |
maxCapacity() | 最大容量= capacity + 可扩容字节 | |
readableBytes() | ByteBuf当前可读字节数,= writerIndex - readerIndex | |
isReadable() | 是否可读 | |
writableBytes() | ByteBuf当前可写字节数,= capacity - writeIndex | |
isWritable() | 是否可写 | |
MaxWritableBytes() | 最大可写字节数,= maxCapacity - writeIndex | |
读写指针 | readerIndex() | 返回当前读指针readerIndex |
readerIndex(int) | 设置读指针index | |
writerIndex() | 返回当前写指针writerIndex | |
writerIndex(int) | 设置写指针index | |
markReaderIndex() | 保存当前读指针(推荐) | |
resetReaderIndex() | 把当前读指针恢复到之前保存的值(推荐) | |
markWriterIndex() | 保存当前写指针(推荐) | |
resetWriterIndex() | 把当前写指针恢复到之前保存的值(推荐) | |
读写 | readBytes(byte[] dst) | 把ByteBuf中的数据全部读取到dst |
writeBytes(byte[] src) | 将src中的数据写入到ByteBuf | |
readByte() | 从ByteBuf中读取一个字节 | |
writeByte(byte b) | 往ByteBuf写入一个字节 | |
retain() | 引用计数加1 | |
release() | 引用计数减1 | |
slice() | 截取readerIndex到writeIndex的数据,返回最大容量为原始ByteBuf的readableBytes()的ByteBuf | |
duplicate() | 共享原始ByteBuf,书本确实示例,后期补全 | |
copy() | 复制原始ByteBuf,返回的ByteBuf写数据不影响原始ByteBuf | |
retainedSlice() | 等价于slice().retain(),需要调用一次release(),否则报错 | |
retainedDuplicate | 等价于duplicate().retain(),需要调用一次release(),否则报错 | |
【闪电侠学netty】第7章 数据载体ByteBuf的介绍相关推荐
- 【Netty】读书笔记 - 跟闪电侠学netty
前言:本篇只是笔者的读书总结,推荐结合原书观看(推荐指数:5星) 上篇 入门实战 第1章 即时聊天系统简介 第2章 Netty是什么 第3章 Netty开发环境配置 第4章 服务端启动流程 第5章 客 ...
- 【闪电侠学netty】第6章 客户端与服务端双向通信
[Netty]读书笔记 - 跟闪电侠学netty 1. 内容概要 1.1 本节实现功能 客户端:连接服务器,之后向服务器发送数据 服务端:接收数据后打印,并向客户端发送数据 1.2 本节知识点 1.2 ...
- 【闪电侠学netty】第2章 Netty是什么
[Netty]读书笔记 - 跟闪电侠学 1. 内容概要 2.1 IO编程 1. 什么是IO编程? Input Stream :数据从外面(磁盘.网络)流进内存 Output Stream:数据从内存流 ...
- 【闪电侠学netty】第8章 客户端与服务端通信协议编解码
[Netty]读书笔记 - 跟闪电侠学 1. 内容概要 1.1 总结 1.1.1 编码与解码定义 编码:把java对象根据协议封装成二进制数据包的过程 解码:从二进制数据包中解析出Java对象的过程 ...
- 【闪电侠学netty】第5章 客户端启动流程
[Netty]读书笔记 - 跟闪电侠学 1. 内容概要 1 客户端启动Demo 启动客户端步骤 Step1:线程模型,服务器引导类Bootstrap Step2:IO 模型 Step3:IO 处理逻辑 ...
- 【闪电侠学netty】第4章 服务端启动流程
[Netty]读书笔记 - 跟闪电侠学 1. 内容概要 1 服务端启动最小化代码 启动服务器步骤 Step1:线程模型,服务器引导类ServerBootstrap Step2:IO 模型 Step3: ...
- 【闪电侠学netty】第1章 即时聊天系统简介
[Netty]读书笔记 - 跟闪电侠学 1. 内容概要 1.1 单聊流程图 1.2 单聊的指令流程图+指令集 1.3 群聊流程图 1.4 群聊的指令流程图+指令集 1.5 Netty核心知识点+客户端 ...
- 【闪电侠学netty】第3章 Netty开发环境配置
[Netty]读书笔记 - 跟闪电侠学 1. 内容概要 主要是工具的安装和使用(省略) 1 Maven 2 Git 3 IntelliJ IDEA 需要了解的客官请购买书籍,或自行CSDN
- 《跟闪电侠学Netty》开篇:Netty是什么?
在开始了解Netty是什么之前,我们先来回顾一下,如果我们需要实现一个客户端与服务端通信的程序,使用传统的IO编程,应该如何来实现? IO编程 我们简化下场景:客户端每隔两秒发送一个带有时间戳的&qu ...
最新文章
- 鸿蒙首个云网站,鸿蒙首个云平台服务全中国
- Windows下使用Tesseract进行OCR文字识别
- Generator + Promises, the best of all worlds in ES6
- xunsearch php,GitHub - ziyueit/xunsearch: 迅搜的一个PHP封装类
- mysql怎么用游标修改数据,如何使用mysql 游标?
- 计算机专业的校本教材,[中职计算机专业校本教材建设思路与实践]中职计算机专业课程...
- Objective-C中@property的所有属性详解
- java基础----集合之Map集合基本方法的使用以及遍历
- linux 文件中搜索字符串命令 grep
- java filter注入_如何在Java Filter 中注入 Service
- MFC初探 —— 双击Picture Control具体位置放大图片
- uclibc 中的 dlopen 不是线程安全的
- cuda和cudnn各版本下载地址
- 地球是圆的:《世界是平的》
- English音标(全)与单词家园
- 成语小秀才小程序V2.0.14完整安装包+小程序前端,小程序吸粉引流源码
- Recovery文件路径
- 饿了么分布式服务治理及优化经验
- poi 导出 word 表格样式
- S7-200SMART PLC如何使用MicroSD存储卡来进行程序传输和固件更新?
热门文章
- PHP.Feast,查看“FEast”的源代码
- 微信开放JS SDK,这场web巨变意味着什么?
- 海马汽车经销商管理系统技术解析(六)顾客生日祝贺
- 移动打击189突显电信前途
- 备份 dup linux,如何用DéjàDup备份Ubuntu的简单方法
- mac下载安装Mac VMware Fusion 12并使用windows10系统
- 【概率论】超几何分布,“超”的含义
- HtmlCss学习笔记
- CF821 B. Okabe and Banana Trees 简单数学
- ChatGPT版Office来了:微软下周四举行发布会,CEO亲自上