• 数据传输载体 --ByteBuf


    Netty 中数据是以ByteBuf为单位进行交互的。

    那么分析一下ByteBuf结构

    ByteBuf结构

    1 ByteBuf是一个字节容器,结构分为三个部分,第一部分是已丢弃字节,这部分数据是无效的,第二部分是可读字节,这部分数据是ByteBuf的主体数据,从 ByteBuf 里面读取的数据都来自这一部分;最后一部分的数据是可写字节,所有写到 ByteBuf 的数据都会写到这一段。最后一部分虚线表示的是该 ByteBuf 最多还能扩容多少容量
    2 上面3段内容有两个指针划分出来的,从左到右,依次是读指针(readerIndex)、写指针(writerIndex),其中变量capacity是ByteBuf的总容量。
    3 从 ByteBuf 中每读取一个字节,readerIndex 自增1,ByteBuf 里面总共有 writerIndex-readerIndex 个字节可读, 由此可以推论出当 readerIndex 与 writerIndex 相等的时候,ByteBuf 不可读
    4 写数据是从 writerIndex 指向的部分开始写,每写一个字节,writerIndex 自增1,直到增到 capacity,这个时候,表示 ByteBuf 已经不可写了
    5 ByteBuf 里面其实还有一个参数 maxCapacity,当向 ByteBuf 写数据的时候,如果容量不足,那么这个时候可以进行扩容,直到 capacity 扩容到 maxCapacity,超过 maxCapacity 就会报错

    容量API

    capacity()
    

    表示ByteBuf的总容量。即 ByteBuf 底层占用了多少字节的内存(包括丢弃的字节、可读字节、可写字节),不同的底层实现机制有不同的计算方式。

     readableBytes() 与 isReadable()
    
    

    readableBytes() 表示 ByteBuf 当前可读的字节数,它的值等于 writerIndex-readerIndex,如果两者相等,则不可读,isReadable() 方法返回 false

    writableBytes()、 isWritable() 与 maxWritableBytes()
    
    

    其中writableBytes()表示ByteBuf可写的字节,它等于capacity-writerIndex,如果两者相等则表示不能向其中写数据了,isWritable()返回false。则不能向其中添加数据了,
    但是Netty有自动扩容机制,直到扩容到底层的内存大小为 maxCapacity,而 maxWritableBytes() 就表示可写的最大字节数,它的值等于 maxCapacity-writerIndex

    读写指针相关的 API

    readerIndex() 与 readerIndex(int)
    

    前者表示返回当前的读指针 readerIndex, 后者表示设置读指针

    writeIndex() 与 writeIndex(int)
    
    

    前者表示返回当前的写指针 writerIndex, 后者表示设置写指针

    markReaderIndex() 与 resetReaderIndex()
    
    

    前者表示把当前的读指针保存起来,后者表示把当前的读指针恢复到之前保存的值,下面两段代码是等价的

    // 代码片段1
    int readerIndex = buffer.readerIndex();
    // .. 其他操作
    buffer.readerIndex(readerIndex);
    
    
    // 代码片段二
    buffer.markReaderIndex();
    // .. 其他操作
    buffer.resetReaderIndex();
    

    希望大家多多使用代码片段二这种方式,不需要自己定义变量,无论 buffer 当作参数传递到哪里,调用 resetReaderIndex() 都可以恢复到之前的状态,在解析自定义协议的数据包的时候非常常见,推荐大家使用这一对 API

  • 相关阅读:
    准备工作
    个人作业感言
    年度书单-结对编程
    案例分析
    编程作业_词频统计
    2、阅读任务
    1、准备工作
    个人作业获奖感言
    3 20210405-1 案例分析作业
    202103226-1 编程作业
  • 原文地址:https://www.cnblogs.com/gloria-liu/p/10303309.html
Copyright © 2020-2023  润新知