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的byteBuf
ByteBuf 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==capacity
System.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 即时通讯系统

Netty 学习笔记(2) ------ 数据传输载体ByteBuf的更多相关文章

  1. Netty 学习笔记(1)通信原理

    前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始.   Netty 的通信原理 Netty 底层 ...

  2. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  3. Netty学习笔记-入门版

    目录 Netty学习笔记 前言 什么是Netty IO基础 概念说明 IO简单介绍 用户空间与内核空间 进程(Process) 线程(thread) 程序和进程 进程切换 进程阻塞 文件描述符 文件句 ...

  4. Netty学习笔记(二)——netty组件及其用法

    1.Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 原生NIO存在的问题 1) NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.Se ...

  5. Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例

    在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...

  6. Netty学习笔记(一)

    学习圣思园Netty笔记,个人理解 2.netty宏观理解-本节内容: 1.阶段性事件驱动,一个请求分为若干阶段处理,每个阶段根据情况合理分配线程去处理,各阶段间通信采用异步事件驱动方式. 2.net ...

  7. Netty学习笔记

    一些类与方法说明 1)ByteBuf ByteBuf的API说明: Creation of a buffer It is recommended to create a new buffer usin ...

  8. Netty学习笔记(一):接收nodejs模拟表单上传的文件

    好久不写博客了,也好久不写代码了,这两天临时遇上一个事情,觉得不难,加上觉得手有些生,就动手做了一下,结果遇上了不少坑,有新坑,有老坑,痛苦无比,现在总算差不多了,赶紧记录下来,希望以后不再重复这种痛 ...

  9. Netty学习笔记(三) 自定义编码器

    编写一个网络应用程序需要实现某种编解码器,编解码器的作用就是讲原始字节数据与自定义的消息对象进行互转.网络中都是以字节码的数据形式来传输数据的,服务器编码数据后发送到客户端,客户端需要对数据进行解码, ...

随机推荐

  1. JavaWeb网上图书商城完整项目--day02-6.ajax校验功能之页面实现

    1 .现在我们要在regist.js中实现ajax的功能,使用用户名到后台查询是否注册,邮箱是否到后台注册,验证码是否正确的功能 我们来看regist.js的代码 //该函数在html文档加载完成之后 ...

  2. MFC:CImage显示OpenCV:Mat矩阵图像

    *************************************/ //1.读入Mat矩阵(cvMat一样),Mat img=imread("*.*");//cvLoad ...

  3. 看完这篇 HashSet,跟面试官扯皮没问题了

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  4. .netcore 网站启动后 502.5

    网站启动后,报错 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure 请检查安装的.netcore runtime版本和hosting版本是否 ...

  5. redis.cluster/memcached.cluster/wmware esxi

    1. 安装配置redis的cluster 集群 redis 集群高可用 实验环境 192.168.198.131 openvpn-server #42-Ubuntu SMP Mon Jun 8 14: ...

  6. vue安装及创建项目的几种方式

    原文地址:https://www.wjcms.net/archives/vue安装及创建项目的几种方式 VUE安装的方式 直接用 script标签 引入 对于制作原型或学习,你可以这样使用最新版本: ...

  7. H5软键盘弹起收回(IOS与Android)

    IOS下中,软键盘处于窗口最顶层,与原有的窗口不冲突,所以底部导航条不会被顶起,但是在android下,软键盘与窗口处于同一层,所以当软键盘弹起时,当前窗口缩小,那么窗口内容自然要被挤: 解决办法: ...

  8. 【MySQL】Merge Index导致死锁

    水稻:最近有个朋友生产环境出现MySQL死锁问题,一听是死锁,那必须去看看啊,于是饶(si)有(qu)兴(huo)致(lai)的研究了好几天 菜瓜:MySQL死锁,赶紧分享一下 水稻:能否先让我装完X ...

  9. Oracle数据库期末总结

    目录 基础内容-服务相关 Oracle体系结构: 表空间与数据文件之间的关系: 内存结构(SGA ,PGA) 表空间(大题)(tablespace) 数据文件(大题)(.dbf) 控制文件,记录和维护 ...

  10. msyql事务的四种隔离级别

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...