nettybuffer源码学习3

Posted benjious

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nettybuffer源码学习3相关的知识,希望对你有一定的参考价值。

问题 :

  • compositeByteBuf 是干什么和其他 compositeByteBuf 有何区别
  • 内部实现

概述

compositeByteBuf 就像数据库中的视图,把几个表的字段组合在一起,它的应用场景比如一个自定义协议有消息头和消息体,而两者是分开到两个 ByteBuf 的,那么这时候要怎么把两个ByteBuf 放到一起管理呢?compositeByteBuf就可以解决这个问题。

源码

 compositeByteBuf 内部放着一个 Components 的数组,这个 Components 是什么呢?
    private final class Component 
        final ByteBuf buf;
        final int length;
        int offset;
        int endOffset;

        Component(ByteBuf buf) 
            this.buf = buf;
            length = buf.readableBytes();
        

        void freeIfNecessary() 
            // Unwrap so that we can free slices, too.
            buf.release(); // We should not get a NPE here. If so, it must be a bug.
        
    

可以看到实际就是 ByteBuf 的包装类,我们看一下它的使用
 addComponent 方法
    /**
     * Add the given @link ByteBuf on the specific index.
     *
     * Be aware that this method does not increase the @code writerIndex of the @link CompositeByteBuf.
     * If you need to have it increased you need to handle it by your own.
     *
     * @param cIndex the index on which the @link ByteBuf will be added
     * @param buffer the @link ByteBuf to add
     */
    public CompositeByteBuf addComponent(int cIndex, ByteBuf buffer) 
        addComponent0(cIndex, buffer);
        consolidateIfNeeded();
        return this;
    

    private int addComponent0(int cIndex, ByteBuf buffer) 
        checkComponentIndex(cIndex);

        if (buffer == null) 
            throw new NullPointerException("buffer");
        

        int readableBytes = buffer.readableBytes();
        if (readableBytes == 0) 
            return cIndex;
        

        // No need to consolidate - just add a component to the list.
        Component c = new Component(buffer.order(ByteOrder.BIG_ENDIAN).slice());
        if (cIndex == components.size()) 
            components.add(c);
            if (cIndex == 0) 
                c.endOffset = readableBytes;
             else 
                Component prev = components.get(cIndex - 1);
                c.offset = prev.endOffset;
                c.endOffset = c.offset + readableBytes;
            
         else 
            components.add(cIndex, c);
            updateComponentOffsets(cIndex);
        
        return cIndex;
    

removeComponent 方法同理

补充

 ByteBufUtil 这个类是可以对 ByteBuf进行操作。 

##参考资料

  • 《netty权威指南》

以上是关于nettybuffer源码学习3的主要内容,如果未能解决你的问题,请参考以下文章

HashMap源码分析 (3. 手撕源码) 学习笔记

mybatis专题-----mybatis源码学习

jquery源码学习

学习总结AFNetworking源码阅读

我的angularjs源码学习之旅3——脏检测与数据双向绑定

jQuery源码学习笔记