zoukankan      html  css  js  c++  java
  • 数据传输载体 --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

  • 相关阅读:
    8.10
    今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?
    Gym 100500B Conference Room(最小表示法,哈希)
    CodeForces 438D The Child and Sequence(线段树)
    UVALIVE 6905 Two Yachts(最小费用最大流)
    Gym Conference Room (最小表示法,哈希)
    hdu 2389 Rain on your Parade(二分图HK算法)
    Codeforces Fox And Dinner(最大流)
    zoj 3367 Counterfeit Money(dp)
    ZOJ3370. Radio Waves(2-sat)
  • 原文地址:https://www.cnblogs.com/gloria-liu/p/10303309.html
Copyright © 2011-2022 走看看