`

netty学习之ChannelBuffer

阅读更多
    这个类的学习其实我感觉看ChannelBuffer的javadoc就能明白大概,也就是网上说的有readerIndex和writerIndex,以及和这两个相关的
markedReaderIndex和markedWriterIndex,我这里重点看一下discardReadBytes
这个函数的实现吧:

public void discardReadBytes() {
        if (readerIndex == 0) {
            return;
        }
        setBytes(0, this, readerIndex, writerIndex - readerIndex);
        writerIndex -= readerIndex;
        markedReaderIndex = Math.max(markedReaderIndex - readerIndex, 0);
        markedWriterIndex = Math.max(markedWriterIndex - readerIndex, 0);
        readerIndex = 0;
    }


     其实就是将readIndex到writerIndex之间length为writerIndex减去readerIndex的byte拷贝到从0去,这样数据就拷贝过去了。然后变更写指针,因为readerIndex到writerIndex直接的空间就被腾出来了,变更写指针到之前的读指针的位置上。然后解决markedReaderIndex和markedWriterIndex这两个指针的位置,最后将readerIndex设置为0.其他的方法理解起来都比较好理解一些。
      ChannelBufferIndexFinder这个接口比较特殊,感觉就是查找是否已经到了某些特殊字符了,比如\r和\n等等,这个对消息的截取等比较有帮助。
      ChannelBufferOutputStream类是将对BufferChannel封装成一个OutputStream,同样的
也有ChannelBufferInputStream类。

分享到:
评论
2 楼 asialee 2013-11-22  
谢谢,我再看一下,不过我看的是netty3的源码,我再确认一下,非常感谢。

jd2bs 写道
你的这句描述是有问题的:“变更写指针到之前的读指针的位置上”跟源代码是不一样的
writerIndex -= readerIndex;

事实上 写指针被变更到readable bytes length的值得位置上

discardReadBytes()方法的作用是 释放discardable区域
比如原先readerIndex=5, writerIndex=9, capacity=14

调用此方法后readerIndex=0, writerIndex=4, 因此现在可写bytes length=10了


markedReaderIndex又是干嘛用的呢? 其实就是字面意义:做标记用的,以便reset时知道该回到哪个位置

请看源码:

public void markReaderIndex() {
        markedReaderIndex = readerIndex;
    }

    public void resetReaderIndex() {
        readerIndex(markedReaderIndex);
    }

    public void markWriterIndex() {
        markedWriterIndex = writerIndex;
    }

    public void resetWriterIndex() {
        writerIndex = markedWriterIndex;
    }

1 楼 jd2bs 2013-11-21  
你的这句描述是有问题的:“变更写指针到之前的读指针的位置上”跟源代码是不一样的
writerIndex -= readerIndex;

事实上 写指针被变更到readable bytes length的值得位置上

discardReadBytes()方法的作用是 释放discardable区域
比如原先readerIndex=5, writerIndex=9, capacity=14

调用此方法后readerIndex=0, writerIndex=4, 因此现在可写bytes length=10了


markedReaderIndex又是干嘛用的呢? 其实就是字面意义:做标记用的,以便reset时知道该回到哪个位置

请看源码:

public void markReaderIndex() {
        markedReaderIndex = readerIndex;
    }

    public void resetReaderIndex() {
        readerIndex(markedReaderIndex);
    }

    public void markWriterIndex() {
        markedWriterIndex = writerIndex;
    }

    public void resetWriterIndex() {
        writerIndex = markedWriterIndex;
    }

相关推荐

Global site tag (gtag.js) - Google Analytics