詳細ネッティーのByteBuf

[ChannelPromise処置:成功または失敗はChannelFutureListenerに知らせるために提供されてもよい]
網状データ処理APIは、2つのコンポーネントByteBufHolder --abstractクラスByteBufとインタフェースを露出しました。

以下はByteBufのAPIの利点のいくつかである
  ;それはユーザー定義型の拡張バッファとすることができる
  内蔵型複合ゼロコピー透明バッファを達成するために、
  容量の需要は(StringBuilderのJDKと同様)増加させることができる;
  読み取りと書き込みの両方二つのモード間の切り替えはByteBufferのフリップ()メソッドを呼び出していない、
  読み取りと異なるインデックスを使用して書き込み、
  メソッド呼び出しチェーンを支持する、
  支持参照カウント、
  支持プーリング。
  別の読み取りを使用し、インデックス・インデックスを作成し、データへのアクセスを制御するために、
  readerIndexは到達しwriterIndex

  メモリを使用する様々な方法-バイト配列と直接バッファに基づいて、
  CompositeByteBufによってByteBuf集約ビューの複数を生成するステップと、
  データアクセス方法-検索、スライシング、および複製;
  - [10容量()]ランダムアクセスランキング
  順インデックスにアクセスする
  [インデックス値を変更するdiscardReadBytes()クリア()]バイトを破棄してもよい
  可読バイト[readBytes(ByteBuf DEST)]
  ;バイト[のwriteBytes(ByteBuf DEST)]を書き込むことができる
  インデックス管理[markReaderIndex()、markWriterIndex() 、resetWriterIndex()とresetReaderIndex(readerIndex(INT)またはwriterIndex(INT)]
  ルックアップ操作[buf.indexOf()、forEachByte(ByteBufProcessor.FIND_NUL) 、INT nullIndex = buf.forEachByte(ByteBufProcessor.FIND_NUL); INT RINDEX = BUF。 forEachByte(ByteBufProcessor.FIND_CRが);]
  新しいバッファを導き出す[BUFを返し、writeIndex markIndexはreadIndexの持っている
  buf.duplicateを();
  ByteBuf REP = buf.copyを(); //コピー作成
  buf.sliceを(); //操作bufのセグメント
  buf.slice(0、5); //】操作BUFセグメント
  読み出し、書き込み、APIを取得し、設定し、
  {(取得/書き込み読み出し動作)およびセット()プロシージャは、指定されたインデックスから開始し、そしてインデックスが保持されていません変異体;リード()と指定されたインデックスから始まる)(書き込み動作、およびインデックスはバイト数]既に訪問に応じて調整することができる
  ByteBufAllocatorプーリング
  ByteBufAllocatorプール=新しいPooledByteBufAllocator(); // フラグメンテーションを低減性能を向上させます効率的な割り当てアルゴリズム
  ByteBufAllocator unpool =新しいUnpooledByteBufAllocator(TRUE) ; // 持つ新しい
  参照カウント
  ByteBufAllocator = ctx.channelアロケータ()ALLOC();.
  ByteBuf directBuf allocator.directBuffer =();
  IF(directBuf.refCnt()== 1){//放出技術を参照して対象となる
  directBuf.releaseは();
  }

@Override 
公共ボイドchannelRead(ChannelHandlerContext CTX、MSGオブジェクト)がスローInterruptedExceptionある{ 
    logger.info( "channelReadスタート"); 
    ByteBuf BUF =(ByteBuf)MSG; 
    IF(buf.hasArray()){//配列BUFをサポートするかどうかをチェックします。
        バイト[] = buf.array配列(); 
        //最初のオフセット
        INT buf.arrayOffset OFF =()+ buf.readerIndex(); 
        //読み取り可能なバイトを取得
        INT LEN = buf.readableBytes() ; 
        バイト[]バッファ=新しい新しいバイト[LEN]; 
        buf.getBytes(OFF、緩衝液); 
        compositeByteBuf compositeByteBuf Unpooled.compositeBuffer =(); 
        ByteBufヘッダ=(ByteBuf)MSG; 
        ByteBuf本体=(ByteBuf)MSG; 
        compositeByteBuf.addComponent(ヘッダ);
        compositeByteBuf.addComponent(本体); 
        buf.markReaderIndexを();
        compositeByteBuf.removeComponent(0); 
        (ByteBuf Bufer:compositeByteBuf)は{ 
            ;のSystem.out.println(bufer.toString())
        } 
        INT comLen compositeByteBuf.readableBytes =(); 

        のために(INT I = 0; I <buf.capacity ();私は++){ 
            するSystem.out.println((CHAR)buf.getByte(I)); 
            終了//が読み取り後に廃棄
            buf.discardReadBytesを(); 
            //呼び出しまたはクリア
            buf.clear(); 
        } 
        //マークインデックス
        buf.readerIndex(2); 
        buf.writeByte(2); 
        //インデックスリセット
        buf.markWriterIndexを(); 
        buf.resetReaderIndex(); 
        buf.resetWriterIndex()。
        //検索
        ; buf.indexOf(0、5、(バイト)0)
        INT nullIndex = buf.forEachByte(ByteBufProcessor.FIND_NUL); 
        INT RINDEX = buf.forEachByte(ByteBufProcessor.FIND_CRを); 
        //新しい派生バッファbufを返します有するwriteIndex markIndex readIndexの
        buf.duplicate(); 
        ByteBuf buf.copy REP =(); //コピー作成
        buf.slice(); // BUF動作セグメント
        buf.slice(0、5); //操作BUFセグメント
        // ==========データアクセス方法-検索、スライスおよび複製、
        文字セットのcharset = Charset.forName( "UTF-8");  
        BUF1 = UNPOOLEDのByteBuf。 copiedBuffer(「アクション岩でネッティー! 」、文字セット); //← - ByteBufの与えられた文字列を格納するために使用されるバイトを作成します
        ByteBufスライスbuf1.slice =(0、15) ; //← -インデックス0からインデックスに新しい15スライスの終わり開始ByteBuf作成
        するSystem.out.println(sliced.toString(文字セットを)); //← - 「アクションでネッティー」を印刷します
        buf1.setByte(0、(バイト) ' J'); //← - インデックス0バイトの更新
        アサートbuf1.getByteを(0)== sliced.getByte( 0); //← - 成功しますデータが別に行われた変更の一つに、共有されているので、また、表示されている

        (「UTF-8」)文字セット= UTF8のCharset.forName; 
        「!網状アクションにロックス」ByteBuf BUF2 = Unpooled.copiedBuffer(UTF8 ); //← - ByteBuf設けられたバイト列保存するために作成され
        、15コピー= buf2.copy(0 ByteBufを ); //← - エンドセグメント0-15 ByteBuf開始インデックスからインデックスを作成それをコピー
        するSystem.out.println(copy.toString(UTF8)); //← - "ネッティーアクションで"印刷します
        buf2.setByte(0、(バイト) 'Jを'); //← -インデックスを更新0でバイト
        !buf2.getByteをアサート(0)= copy.getByte (0); - //← データが共有されていないので、成功します

        Unpooled.unmodifiableBuffer(BUF); 
        buf.order(); 
        buf.readSlice (1)。
       //異なるリードを使用して索引データアクセスを制御するために、インデックスを書き込み; 
        //読み取りおよび書き込み動作は/インデックス読み出し/書き込み指数変化(readIndex / writeIndex)位置の位置変更することなく、設定を取得

        文字セットU8 = Charset.forName(「UTF- 8」 ); 
        ByteBuf getSetBuf = Unpooled.copiedBuffer( "アクションロックスのネッティー!"、U8); //指定されたバイト文字列保存するために新しいByteBufを作成
        するSystem.out.printlnを((文字)getSetBuf.getByte(0 )); //最初の文字を印刷'N' 
        INT readerIndex getSetBuf.readerIndex =(); //格納readerIndex writerIndex現在
        INT writerIndex getSetBuf.writerIndex =(); 
        getSetBuf.setByte(0、(バイト)「B B ';「)//バイトインデックス0は文字に更新される」 
        のSystem.out.println((CHAR)getSetBuf.getByte(0)); //最初の文字を印刷し、今「B」であります 
        readerIndex == getSetBuf.readerIndexを主張する();これらの操作は、対応するインデックス変更されませんので、//は、成功します
        アサートwriterIndex == getSetBuf.writerIndexを(); 


        ByteBuf readWriteBuf = Unpooled.copiedBuffer( "アクションロックスのネッティー!" 、U8); //指定されたバイト文字列を保持する新しいByteBufを作成
        するSystem.out.println((文字)readWriteBuf.readByte() ); //は、 最初の文字'N'印刷
        のSystem.outを。 println((ブール)readWriteBuf.readBoolean() ); //は現在のブール値と+を読み取る1 readIndex。
        readWriteBuf.writeByte( 'F'); // Fが文字バッファに追加され、writeIndex + 1 
        INT REINDEX = readWriteBuf.readerIndex(); //とは、格納現在readerIndex writerIndex 
        INT wrIndex readWriteBuf.writerIndex =(); 
        readWriteBuf.setByte(0、(バイト) 'B'); //バイトインデックスを更新0文字「B」 
        のSystem.out.println((CHAR)readWriteBuf .getByte(0)); //最初の文字を印刷し、それは今「B」である 
        )アサートREINDEX readWriteBuf.readerIndex ==(;これらの操作は、インデックスの変更はありませんので、//は、成功します
        アサートwrIndexを== readWriteBuf.writerIndex();
 
        )buf.isReadableを(; //は、少なくとも一つの文字を読んで、trueに返す
        buf.isWritable(); //少なくとも1つのバイトを書き込むことができ、trueに返す
        (int型readableByte buf.readableBytes = ); //読み込むことができるバイト数を返し
        INT writableByte = buf.writableBytes()を; //を書き込むことができるバイト数を返す
        INT容量= buf.capacity(); //戻りバイトを受信します数
        buf.maxCapacity(); //を収容することができる最大バイト数を返し
        buf.hasArrayを(); //サポートの場合BUFバイト配列、真を返し
        buf.array(); //バイトBUFを変換アレイ

        データの//加え、そして等HTTPステータスコード、クッキー、などのいくつかの他の特性、
        byteBufHolder byteBufHolder =新しいDefaultLastHttpContent()。
        ByteBuf httpContent = byteBufHolder.content(); // HTTP形式を返すByteBuf 
        ByteBufHolder copyBufHolder byteBufHolder.copy =(); //ディープコピー、共有されていない
        ByteBufHolder duplicateBufHolder = byteBufHolder.duplicate(); //シャローコピー、シェア
 
        // ByteBufAllocator ByteBuf分布
        //バッファ()、またはダイレクトメモリヒープBUFに基づいて
        // IoBuffer()はIOBUF返す
        //スタックheapBufferのBUF 
        // directBuffer直接bufを
        // compositeBuffer compositeHeapBuffer compositeDirectBuffer複合BUF 
        ByteBufAllocator ctxAllocator ctx.alloc =(); 
        ByteBufAllocator channelAllocator = ctx.channel ().alloc(); 
        ctxAllocator.buffer(); 
        ctxAllocator.ioBuffer(); 
        ctxAllocator.compositeBuffer()。 
        ctxAllocator.heapBuffer(); 
        ctxAllocator.directBuffer(); 

        ByteBufAllocatorプール=新しい新しいPooledByteBufAllocator(); //性能を向上断片化、効率的な配分を減らしますアルゴリズム
        ByteBufAllocator unpool =新しいUnpooledByteBufAllocator(真) ; // 作成してい

        ctx.writeAndFlushを(新しいバイト[10]) 。
        ctx.writeAndFlush(Unpooled.copiedBuffer(新しいバイト[10 ])); // writeAndFlush パラメータが効率BUF改善するために、非プールされたスイッチ技術を使用して、オブジェクト
        ByteBufUtil //ツールを
        ByteBufUtil.hexDump(BUF); bufにする//缶変換
        ByteBufUtil.hexDump(新しいバイト[9999]) ; //はバイトに変換することができる
        @参照カウント:特定のオブジェクトの参照カウントを追跡
        ByteBufAllocator = ctx.channelアロケータ()ALLOC();. 
        ByteBuf = directBufアロケータ。 directBuffer(); 
        IF(。directBuf.refCnt()== 1){//リリースオブジェクト技術を参照1。 
            directBuf.release();
        } 

        IF(buf.readableBytes()<= 0){ 
            ReferenceCountUtil.safeRelease(MSG); 
            リターン; 
        } 
        バイト[] = msgContent新しい新しいバイト[buf.readableBytes()]; 
        buf.readBytes(msgContent)。 
        logger.info( "クライアントからRECV:長さ:{}、toHexString:{} \ N-"、buf.readableBytes() 、HexStringUtils.toHexString(buf.array())); 
        IF(buf.getByte(0)== 0x7Eを&& buf.getByte(buf.readableBytes() - 1)== 0x7Eを)} { 
        IF(msgContent [0] = 0x7Eを&& msgContent = [-msgContent.length 1] == 0x7Eを){} 
    } 

} 


//統合は、一般的にChannelInboundHandlerAdapterある場合、複製channelRead()、手動解除メッセージのために必要

//メッセージ・コンシューマが自動的に終了後に放出される
(プライベートボイドリリースMSGオブジェクト){ 
    試み{ 
        ReferenceCountUtil.release(MSG); 
    }キャッチ(例外E){
        e.printStackTrace(); 
    } 
} 
================================================ === 
 
/ ()メソッドは、自動的に追加解放メッセージの方法でSimpleChannelInboundHandlerに/ channelRead0
// SimpleChannelInboundHandlerは、<I>はChannelInboundHandlerAdapter延び
@Override 
公共ボイドchannelRead(ChannelHandlerContext CTX、オブジェクトMSG)は例外{スロー
    ブール放出=がtrue; 
    試す{ 
        (acceptInboundMessage(MSG)){場合
            @SuppressWarnings( "未チェック")
            私は=(I)MSGをIMSG。
            channelRead0(CTX、IMSG)。
        }他{ 
            解放= FALSE; 
            ctx.fireChannelRead(MSG)。
        } 
    }最後に{ 
        IF(自動解放&&放出){
            ReferenceCountUtil.release(MSG)。
        } 
    } 
}

  

おすすめ

転載: www.cnblogs.com/htkj/p/10932668.html