1. Netty学习之ByteBuf

ByteBuf的分配
一. ByteBufAllocator 池类
    可分配基于堆的或者直接内存的ByteBuf
   获得ByteBufAllocator引用的的两种方式:

    channel.alloc();
    ctx.alloc();
  ByteBufAllocator的两种实现:
    PooledByteBufAllocator
    UnpooledByteBufAllocator
二.Unpooled 非池化的Bytebuf

三.ByteBufUtil

ByteBuf 和 ByteBufHolder
ByteBuf的主要有读写两个指针,这是他比原生ByteBuffer方便和易于理解的地方
read*, write*开头的方法会改变索引,但是set*将不会改变索引位置
|**** 版本号 4个字节的长度 具体的内容****|

ByteBuf 的使用模式
1. 堆缓冲区(基于数组实现的)
所以可以通过hasArray判断是否支持数组

ByteBuf heapBuf = ...;
if (heapBuf.hasArray()) { //1
  byte[] array = heapBuf.array(); //2
  int offset = heapBuf.arrayOffset() + heapBuf.readerIndex(); //3
  int length = heapBuf.readableBytes();//4
  handleArray(array, offset, length); //5
}

2. 直接缓冲区

ByteBuf directBuf = ...
if (!directBuf.hasArray()) { //1
    int length = directBuf.readableBytes();//2
    byte[] array = new byte[length]; //3
    directBuf.getBytes(directBuf.readerIndex(), array); //4
    handleArray(array, 0, length); //5
}

3. 复合缓冲区(CompositeByteBuf )
hasArray始终返回false

CompositeByteBuf messageBuf = ...;
ByteBuf headerBuf = ...; // 可以支持或直接
ByteBuf bodyBuf = ...; // 可以支持或直接
messageBuf.addComponents(headerBuf, bodyBuf);
    // ....
messageBuf.removeComponent(0); // 移除头 //2

for (int i = 0; i < messageBuf.numComponents(); i++) { //3
    System.out.println(messageBuf.component(i).toString());
}
    

访问数据

CompositeByteBuf compBuf = ...;
int length = compBuf.readableBytes(); //1
byte[] array = new byte[length]; //2
compBuf.getBytes(compBuf.readerIndex(), array); //3
handleArray(array, 0, length); //4

随机访问索引:
  如getByte,不会改变索引

可丢弃的字节重新利用:
  iscardReadBytes();

索引操作:
markWriterIndex()
markReaderIndex()
resetReaderIndex()
resetWriterIndex()
clear() 比 discardReadBytes()成本更低

查询操作:
forEachByte
int index = buffer.forEachByte(ByteBufProcessor.FIND_CR);
forEachByte(ByteBufProcessor.FIND_NUL)

衍生的缓冲区:
代表一个专门的展示 ByteBuf 内容的“视图"
这种视图由下面几种方法产生
duplicate(), slice(), slice(int, int),readOnly(),order(ByteOrder)
这种视图和源是数据共享的吗? 读写索引是一样的吗? 标记索引是一样的吗?
答:都是共享的

拷贝:
copy()和copy(int, int)
这个副本是独立的, 和源数据不共享

需要某段数据:
slice(int, int)
和源数据是共享的

读写操作:
set写入/get读取不会改变索引
write/read

时间: 2024-11-05 04:49:54

1. Netty学习之ByteBuf的相关文章

netty 学习资料

最近在做一个网页遥控器的项目,用到了netty,但还未发现比较系统完整的netty博客教程,所以打算自己写一个netty学习教程,会每天更新一篇,欢迎交流. 先给大家提供一些资料: 1. 比较简短易懂的有实例的系列教程,涉及到了netty关键特性:但个人觉得比较速成,不系统,不深入 http://www.coderli.com/netty-course-hello-world http://www.coderli.com/netty-two-concepts http://www.coderli

netty学习资源收集

Netty学习笔记 Netty+In+Action中文版.pdf

Netty学习篇--整合springboot

经过前面的netty学习,大概了解了netty各个组件的概念和作用,开始自己瞎鼓捣netty和我们常用的项目的整合(很简单的整合) 项目准备 工具:IDEA2017 jar包导入:maven 项目框架:springboot+netty 项目操作 右键创建一个maven项目,项目名称: hetangyuese-netty-03(项目已上传github) 项目完整结构 ? maven导包 <!-- netty start --> <dependency> <groupId>

Netty学习——基于netty实现简单的客户端聊天小程序

Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEven

Netty学习——通过websocket编程实现基于长连接的双攻的通信

Netty学习(一)基于长连接的双攻的通信,通过websocket编程实现 效果图,客户端和服务器端建立起长连接,客户端发送请求,服务器端响应 但是目前缺少心跳,如果两个建立起来的连接,一个断网之后,另外一个是感知不到对方已经断掉的.以后使用心跳技术来进行连接检测 须知: 状态码101,代表 协议转换,从HTTP协议升级为WebSocket协议 HTTP协议,一般访问的时候:是 Http://localhost:8080/ws WebSocket协议,访问的时候,需要是:ws://localho

Netty学习——Netty和Protobuf的整合(一)

Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执行一下protoc 异常捕获:启动服务器端正常,在启动客户端的时候,发送消息,报错 警告: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the l

Netty学习路线规划

第一步   第一个Netty应用 服务端 (serverChannel) EchoServerHandler 简单的接收打印,将所接收的消息返回给发送者 冲刷所有待审消息到远程节点 关闭通道后,操作完成 服务端 (server) EchoServer 创建EventLoopGroup.ServerBootstrap 指定 Channel 设置 socket 地址使用所选的端口 添加 EchoServerHandler 到 Channel 的 ChannelPipeline 绑定的服务器;sync

Netty学习之服务器端创建

一.服务器端开发时序图 图片来源:Netty权威指南(第2版) 二.Netty服务器端开发步骤 使用Netty进行服务器端开发主要有以下几个步骤: 1.创建ServerBootstrap实例 ServerBootstrap b=new ServerBootstrap(); ServerBootstrap是Netty服务器端的启动辅助类,提供了一系列的方法用于设置服务器端启动相关的参数. 2.设置并绑定Reactor线程池 EventLoopGroup bossGruop=new NioEvent

Netty学习之TCP粘包/拆包

一.TCP粘包/拆包问题说明,如图 二.未考虑TCP粘包导致功能异常案例 按照设计初衷,服务端应该收到100条查询时间指令的请求查询,客户端应该打印100次服务端的系统时间 1.服务端类 package com.phei.netty.s2016042302; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitial