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

  • 相关阅读:
    公开课 | 高段位的测试开发工程师是如何养成的?
    测试面试真题 | 从屡次碰壁到成长蜕变,半年拿下某大厂 60W 年薪测试开发 Offer!
    Git实战(五)| 让工作更高效,搞定Git的分支管理
    双 11 钜惠 | 测试开发爆款课程全年最低价,送 Mate40Pro、Kindle、华为手环等万元豪礼!
    测试面经 | 从测试螺丝钉到大厂测试开发,三点成长心得和面试经验
    Sql Server 常用函数
    IE Web Control介绍以及TreeView 控件树形结构不能显示的问题
    一个javascript脚本写的时钟
    使用DataGrid控件实现主细表
    解决 SQL Server 耗尽内存的情况
  • 原文地址:https://www.cnblogs.com/gloria-liu/p/10303309.html
Copyright © 2011-2022 走看看