【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的介绍相关推荐

  1. 【Netty】读书笔记 - 跟闪电侠学netty

    前言:本篇只是笔者的读书总结,推荐结合原书观看(推荐指数:5星) 上篇 入门实战 第1章 即时聊天系统简介 第2章 Netty是什么 第3章 Netty开发环境配置 第4章 服务端启动流程 第5章 客 ...

  2. 【闪电侠学netty】第6章 客户端与服务端双向通信

    [Netty]读书笔记 - 跟闪电侠学netty 1. 内容概要 1.1 本节实现功能 客户端:连接服务器,之后向服务器发送数据 服务端:接收数据后打印,并向客户端发送数据 1.2 本节知识点 1.2 ...

  3. 【闪电侠学netty】第2章 Netty是什么

    [Netty]读书笔记 - 跟闪电侠学 1. 内容概要 2.1 IO编程 1. 什么是IO编程? Input Stream :数据从外面(磁盘.网络)流进内存 Output Stream:数据从内存流 ...

  4. 【闪电侠学netty】第8章 客户端与服务端通信协议编解码

    [Netty]读书笔记 - 跟闪电侠学 1. 内容概要 1.1 总结 1.1.1 编码与解码定义 编码:把java对象根据协议封装成二进制数据包的过程 解码:从二进制数据包中解析出Java对象的过程 ...

  5. 【闪电侠学netty】第5章 客户端启动流程

    [Netty]读书笔记 - 跟闪电侠学 1. 内容概要 1 客户端启动Demo 启动客户端步骤 Step1:线程模型,服务器引导类Bootstrap Step2:IO 模型 Step3:IO 处理逻辑 ...

  6. 【闪电侠学netty】第4章 服务端启动流程

    [Netty]读书笔记 - 跟闪电侠学 1. 内容概要 1 服务端启动最小化代码 启动服务器步骤 Step1:线程模型,服务器引导类ServerBootstrap Step2:IO 模型 Step3: ...

  7. 【闪电侠学netty】第1章 即时聊天系统简介

    [Netty]读书笔记 - 跟闪电侠学 1. 内容概要 1.1 单聊流程图 1.2 单聊的指令流程图+指令集 1.3 群聊流程图 1.4 群聊的指令流程图+指令集 1.5 Netty核心知识点+客户端 ...

  8. 【闪电侠学netty】第3章 Netty开发环境配置

    [Netty]读书笔记 - 跟闪电侠学 1. 内容概要 主要是工具的安装和使用(省略) 1 Maven 2 Git 3 IntelliJ IDEA 需要了解的客官请购买书籍,或自行CSDN

  9. 《跟闪电侠学Netty》开篇:Netty是什么?

    在开始了解Netty是什么之前,我们先来回顾一下,如果我们需要实现一个客户端与服务端通信的程序,使用传统的IO编程,应该如何来实现? IO编程 我们简化下场景:客户端每隔两秒发送一个带有时间戳的&qu ...

最新文章

  1. 鸿蒙首个云网站,鸿蒙首个云平台服务全中国
  2. Windows下使用Tesseract进行OCR文字识别
  3. Generator + Promises, the best of all worlds in ES6
  4. xunsearch php,GitHub - ziyueit/xunsearch: 迅搜的一个PHP封装类
  5. mysql怎么用游标修改数据,如何使用mysql 游标?
  6. 计算机专业的校本教材,[中职计算机专业校本教材建设思路与实践]中职计算机专业课程...
  7. Objective-C中@property的所有属性详解
  8. java基础----集合之Map集合基本方法的使用以及遍历
  9. linux 文件中搜索字符串命令 grep
  10. java filter注入_如何在Java Filter 中注入 Service
  11. MFC初探 —— 双击Picture Control具体位置放大图片
  12. uclibc 中的 dlopen 不是线程安全的
  13. cuda和cudnn各版本下载地址
  14. 地球是圆的:《世界是平的》
  15. English音标(全)与单词家园
  16. 成语小秀才小程序V2.0.14完整安装包+小程序前端,小程序吸粉引流源码
  17. Recovery文件路径
  18. 饿了么分布式服务治理及优化经验
  19. poi 导出 word 表格样式
  20. S7-200SMART PLC如何使用MicroSD存储卡来进行程序传输和固件更新?

热门文章

  1. PHP.Feast,查看“FEast”的源代码
  2. 微信开放JS SDK,这场web巨变意味着什么?
  3. 海马汽车经销商管理系统技术解析(六)顾客生日祝贺
  4. 移动打击189突显电信前途
  5. 备份 dup linux,如何用DéjàDup备份Ubuntu的简单方法
  6. mac下载安装Mac VMware Fusion 12并使用windows10系统
  7. 【概率论】超几何分布,“超”的含义
  8. HtmlCss学习笔记
  9. CF821 B. Okabe and Banana Trees 简单数学
  10. ChatGPT版Office来了:微软下周四举行发布会,CEO亲自上