<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chan Chen Coding...

    Netty 4.0 源碼分析(四):ByteBuf

    Netty是基于流的消息傳遞機制。Netty框架中,所有消息的傳輸都依賴于ByteBuf接口,ByteBufNetty NIO框架中的緩沖區(qū)。ByteBuf接口可以理解為一般的Byte數(shù)組,不過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通過兩個指針來協(xié)助I/O的讀寫操作,讀操作的readIndex和寫操作的writeIndex

    readerIndexwriterIndex都是一開始都是0,隨著數(shù)據(jù)的寫入writerIndex會增加,讀取數(shù)據(jù)會使readerIndex增加,但是他不會超過writerIndx,在讀取之后,0-readerIndex的就被視為discard.調(diào)用discardReadBytes方法,可以釋放這部分空間,他的作用類似ByeBuffercompact方法;

    讀和寫的時候Index是分開的,因此也就沒必要再每次讀完以后調(diào)用flip方法,另外還有indexOfbytesBefore等一些方便的方法;

     

    ByteBuf的幾個重要方法

    discardReadBytes()
    丟棄已讀的內(nèi)容。其執(zhí)行過程如下:
    調(diào)用discardReadBytes()之前:


    調(diào)用 discardReadBytes()方法后


    clear()
    丟棄所有的數(shù)據(jù),并將readerIndexwriterIndex重置為0


    調(diào)用clear()之前


    調(diào)用clear()之后


     

     
    備注:因為筆者開始寫Netty源碼分析的時候,Netty 4.0還是處于Alpha階段,之后的API可能還會有改動,筆者將會及時更改。使用開源已經(jīng)有好幾年的時間了,一直沒有時間和精力來具體研究某個開源項目的具體實現(xiàn),這次是第一次寫開源項目的源碼分析,如果文中有錯誤的地方,歡迎讀者可以留言指出。對于轉(zhuǎn)載的讀者,請注明文章的出處。

    希望和廣大的開發(fā)者/開源愛好者進行交流,歡迎大家的留言和討論。


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

    posted on 2012-11-25 20:44 Chan Chen 閱讀(9206) 評論(0)  編輯  收藏 所屬分類: Netty

    主站蜘蛛池模板: 美女被cao免费看在线看网站| 爽爽爽爽爽爽爽成人免费观看| 91免费国产自产地址入| 精品国产亚洲一区二区三区| 亚洲综合一区二区三区四区五区| 无码区日韩特区永久免费系列| 亚洲美女视频免费| 亚洲成a人片在线不卡| 亚洲国产成人久久77| 午夜免费福利视频| 亚洲精品在线电影| 成人免费激情视频| 亚洲日本在线电影| 亚洲国产精品成人久久蜜臀 | 黄床大片免费30分钟国产精品 | free哆拍拍免费永久视频| 亚洲精品线路一在线观看| 黄床大片免费30分钟国产精品| 亚洲AV无码久久精品色欲| 2020因为爱你带字幕免费观看全集 | 最近免费中文字幕视频高清在线看| 亚洲熟女综合色一区二区三区| 四虎在线播放免费永久视频| 久久高潮一级毛片免费| 99久久精品国产亚洲| 免费做爰猛烈吃奶摸视频在线观看| 曰批全过程免费视频播放网站 | 亚洲日本在线观看网址| 成年午夜视频免费观看视频| 污视频网站免费观看| 亚洲AV日韩AV永久无码绿巨人| 日本一区二区三区免费高清| 永久免费无码网站在线观看个| 久久亚洲精品成人777大小说| 成人免费无毒在线观看网站| 皇色在线免费视频| 2019亚洲午夜无码天堂| 婷婷亚洲天堂影院| 亚洲毛片免费视频| av电影在线免费看| 男人天堂2018亚洲男人天堂|