Chan Chen Coding...

Netty 4.0 源码分析(四):ByteBuf

Netty是基于流的消息传递机制。Netty框架中,所有消息的传输都依赖于ByteBuf接口,ByteBufNetty NIO框架中的缓冲区。ByteBuf接口可以理解为一般的Byte数组,不过NettyByte进行了封装,增加了一些实用的方法。


ChannelBuf接口

package io.netty.buffer;
public interface ChannelBuf {
    ChannelBufType type();
    boolean isPooled();
}


ByteBuf接口 

package io.netty.buffer;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.GatheringByteChannel;
import java.nio.channels.ScatteringByteChannel;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
public interface ByteBuf extends ChannelBuf, Comparable<ByteBuf> {
    int capacity();
    ByteBuf capacity(int newCapacity);
    int maxCapacity();
    ByteOrder order();
    ByteBuf order(ByteOrder endianness);
    boolean isDirect();
    int readerIndex();
    ByteBuf readerIndex(int readerIndex);
    int writerIndex();
    ByteBuf writerIndex(int writerIndex);
    ByteBuf setIndex(int readerIndex, int writerIndex);
    int readableBytes();
    int writableBytes();
    boolean readable();
    boolean writable();
    ByteBuf clear();
    ByteBuf markReaderIndex();
    ByteBuf resetReaderIndex();
    ByteBuf markWriterIndex();
    ByteBuf resetWriterIndex();
    ByteBuf discardReadBytes();
    ByteBuf ensureWritableBytes(int minWritableBytes);
    int ensureWritableBytes(int minWritableBytes, boolean force);
    boolean getBoolean(int index);
    byte  getByte(int index);
    short getUnsignedByte(int index);
    short getShort(int index);
    int getUnsignedShort(int index);
    int   getMedium(int index);
    int   getUnsignedMedium(int index);
    int   getInt(int index);
    long  getUnsignedInt(int index);
    long  getLong(int index);
    char  getChar(int index);
    float getFloat(int index);
    double getDouble(int index);
    ByteBuf getBytes(int index, ByteBuf dst);
    ByteBuf getBytes(int index, ByteBuf dst, int length);
    ByteBuf getBytes(int index, ByteBuf dst, int dstIndex, int length);
    ByteBuf getBytes(int index, byte[] dst);
    ByteBuf getBytes(int index, byte[] dst, int dstIndex, int length);
    ByteBuf getBytes(int index, ByteBuffer dst);
    ByteBuf getBytes(int index, OutputStream out, int length) throws IOException;
    int getBytes(int index, GatheringByteChannel out, int length) throws IOException;
    ByteBuf setBoolean(int index, boolean value);
    ByteBuf setByte(int index, int value);
    ByteBuf setShort(int index, int value);
    ByteBuf setMedium(int index, int   value);
    ByteBuf setInt(int index, int   value);
    ByteBuf setLong(int index, long  value);
    ByteBuf setChar(int index, int value);
    ByteBuf setFloat(int index, float value);
    ByteBuf setDouble(int index, double value);
    ByteBuf setBytes(int index, ByteBuf src);
    ByteBuf setBytes(int index, ByteBuf src, int length);
    ByteBuf setBytes(int index, ByteBuf src, int srcIndex, int length);
    ByteBuf setBytes(int index, byte[] src);
    ByteBuf setBytes(int index, byte[] src, int srcIndex, int length);
    ByteBuf setBytes(int index, ByteBuffer src);
    int setBytes(int index, InputStream in, int length) throws IOException;
    int  setBytes(int index, ScatteringByteChannel in, int length) throws IOException;
    ByteBuf setZero(int index, int length);
     boolean readBoolean();
    byte  readByte();
    short readUnsignedByte();
    short readShort();
    int   readUnsignedShort();
    int   readMedium();
    int   readUnsignedMedium();
    int   readInt();
    long  readUnsignedInt();
    long  readLong();
    char  readChar();
    float readFloat();
    double readDouble();
    ByteBuf readBytes(int length);
    ByteBuf readSlice(int length);
    ByteBuf readBytes(ByteBuf dst);
    ByteBuf readBytes(ByteBuf dst, int length);
    ByteBuf readBytes(ByteBuf dst, int dstIndex, int length);
    ByteBuf readBytes(byte[] dst);
    ByteBuf readBytes(byte[] dst, int dstIndex, int length);
    ByteBuf readBytes(ByteBuffer dst);
    ByteBuf readBytes(OutputStream out, int length) throws IOException;
    int  readBytes(GatheringByteChannel out, int length) throws IOException;
    ByteBuf skipBytes(int length);
    ByteBuf writeBoolean(boolean value);
    ByteBuf writeByte(int value);
    ByteBuf writeShort(int value);
    ByteBuf writeMedium(int   value);
    ByteBuf writeInt(int   value);
    ByteBuf writeLong(long  value);
    ByteBuf writeChar(int value);
    ByteBuf writeFloat(float value);
    ByteBuf writeDouble(double value);
    ByteBuf writeBytes(ByteBuf src);
    ByteBuf writeBytes(ByteBuf src, int length);
    ByteBuf writeBytes(ByteBuf src, int srcIndex, int length);
    ByteBuf writeBytes(byte[] src);
    ByteBuf writeBytes(byte[] src, int srcIndex, int length);
    ByteBuf writeBytes(ByteBuffer src);
    int  writeBytes(InputStream in, int length) throws IOException;
    int  writeBytes(ScatteringByteChannel in, int length) throws IOException;
    ByteBuf writeZero(int length);
    int indexOf(int fromIndex, int toIndex, byte value);
    int indexOf(int fromIndex, int toIndex, ByteBufIndexFinder indexFinder);
    int bytesBefore(byte value);
    int bytesBefore(ByteBufIndexFinder indexFinder);
    int bytesBefore(int length, byte value);
    int bytesBefore(int length, ByteBufIndexFinder indexFinder);
    int bytesBefore(int index, int length, byte value);
    int bytesBefore(int index, int length, ByteBufIndexFinder indexFinder);
    ByteBuf copy();
    ByteBuf copy(int index, int length);
    ByteBuf slice();
    ByteBuf slice(int index, int length);
    ByteBuf duplicate();
    boolean hasNioBuffer();
    ByteBuffer nioBuffer();
    ByteBuffer nioBuffer(int index, int length);
    boolean hasNioBuffers();
    ByteBuffer[] nioBuffers();
    ByteBuffer[] nioBuffers(int offset, int length);
    boolean hasArray();
    byte[] array();
    int arrayOffset();
    String toString(Charset charset);
    String toString(int index, int length, Charset charset);
    @Override
    int hashCode();
    @Override
    boolean equals(Object obj);
    @Override
    int compareTo(ByteBuf buffer);
    @Override
    String toString();
    Unsafe unsafe();
    interface Unsafe {
        ByteBuffer nioBuffer();
        ByteBuffer[] nioBuffers();
        ByteBuf newBuffer(int initialCapacity);
        void discardSomeReadBytes();
        void acquire();
        void release();
    }
}

 

 


ByteBuf Index

 

ByteBuf通过两个指针来协助I/O的读写操作,读操作的readIndex和写操作的writeIndex

readerIndexwriterIndex都是一开始都是0,随着数据的写入writerIndex会增加,读取数据会使readerIndex增加,但是他不会超过writerIndx,在读取之后,0-readerIndex的就被视为discard.调用discardReadBytes方法,可以释放这部分空间,他的作用类似ByeBuffercompact方法;

读和写的时候Index是分开的,因此也就没必要再每次读完以后调用flip方法,另外还有indexOfbytesBefore等一些方便的方法;

 

ByteBuf的几个重要方法

discardReadBytes()
丢弃已读的内容。其执行过程如下:
调用discardReadBytes()之前:


调用 discardReadBytes()方法后


clear()
丢弃所有的数据,并将readerIndexwriterIndex重置为0


调用clear()之前


调用clear()之后


 

 
备注:因为笔者开始写Netty源码分析的时候,Netty 4.0还是处于Alpha阶段,之后的API可能还会有改动,笔者将会及时更改。使用开源已经有好几年的时间了,一直没有时间和精力来具体研究某个开源项目的具体实现,这次是第一次写开源项目的源码分析,如果文中有错误的地方,欢迎读者可以留言指出。对于转载的读者,请注明文章的出处。

希望和广大的开发者/开源爱好者进行交流,欢迎大家的留言和讨论。


-----------------------------------------------------
Silence, the way to avoid many problems;
Smile, the way to solve many problems;

posted on 2012-11-25 20:44 Chan Chen 阅读(9195) 评论(0)  编辑  收藏 所属分类: Netty


只有注册用户登录后才能发表评论。


网站导航: