[ネティスタート]10コーデックフレームワーク


10.コーデックフレームワーク


codekとは?


各ネットワークアプリケーションは、ピアツーピア転送の元のバイトを解析してターゲットプログラムのデータフォーマットに変換する方法を定義する必要があります.これらの変換ロジックは、あるフォーマットから別のフォーマットにバイトストリームを変換するエンコーダおよびデコーダからなるコーデック処理である.
特定のアプリケーションでは、意味のあるバイトのシーケンス構造をメッセージと呼びます.エンコーダは、このメッセージを送信に適したフォーマット(ほとんどがバイトストリーム)に変換し、デコーダはネットワークストリームをプログラム内のメッセージフォーマットに再変換します.また、エンコーダはインバウンドデータを処理し、デコーダはインバウンドデータを処理する.

デコーダ


ここでは、Nettyのデコーダクラスについて説明し、これらのクラスをいつ使用するか、どのように使用するかを学ぶ具体的な例を示します.これらのクラスは、2つのユニークな使用例をサポートします.
  • バイトストリームをメッセージに復号する:ByteToMessageDecoderおよびReplatingDecoder
  • メッセージを他のメッセージタイプに復号する:MessageToMessageDecoder
  • デコーダはインバウンドデータを他のフォーマットに変換する責任を負うので、ネティのデコーダは自然にChannelInboundHandlerを実現する.
    デコーダはいつ使用しますか?インバウンドデータをChannelPipelineの次のChannelInboundHandlerに変換するときに使用します.また,ChannelPipelineの設計方式により,複数のデコーダをリンクする方法により,より複雑な変換論理を実現できる.これはNettyがコードのモジュール化と再利用性をサポートする良い例です.

    ByteToMessageDecoder抽象クラス


    バイトストリームをメッセージ(または他のバイトのシーケンス)に復号する操作は非常に一般的であるため、ネティはこの操作のための抽象ベースクラスByteToMessageDecoderを提供する.リモート・ピアが完了したメッセージを同時に送信するかどうか分からないため、このクラスはインバウンド・データが十分な処理データを収集するまでバッファに格納されます.
    方法説明デコーダ(ChannelHandlerContext ctx,ByteBuf in,Listout)は、受信データを含むByteBufと復号メッセージを追加するリストを受信する唯一の実装が必要な抽象的な方法である.この呼び出しは、リストに追加する新しいエントリまたはByteBufに読み取り可能なバイトがなくなるまで繰り返されます.その後、リストに空きがなければ、FIPLE佳仁の次のHandlerに内容が伝わります.DecodeLast(ChannelHandlerContext ctx,ByteBuf in,Listout)内蒂が提供する基本的な実装はdecode()のみを呼び出す.このメソッドは、チャネルを無効にするときに呼び出されます.特別な処理が必要な場合は、このメソッドを再定義します.
    public class ToIntegerDecoder extends ByteToMessageDecoder {
        @Override
        public void decode(ChnnaleHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
        {
            if (in.readableBytes() >= 4) 
            {
                out.add(in.readInt());
            }
        }
    }
    ReplayingDecoderを使用するにはreadbytesを使用する必要はありません.
    public class ToIntegerDecoder2 extends ReplayingDecoder<Void> {
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
            out.add(in.readInt());
        }
    }
    ReplayingDecoderBufferには、次の点があります.
    すべてのByteBuf操作がサポートされているわけではありません.サポートされていないメソッドを呼び出すと、Unsupported OperationExceptionが発生します.
  • ReplayingDecoderはByteToMesageDecoderより少し遅いです.
  • その他のデコーダ
    より複雑な使用例を処理するには、次のクラスを使用します.
    io.netty.handler.codec.LineBasedFrameDecoder:埋め込みクラスとして、改行記号(nまたはrn)を使用してメッセージデータを解析します.
    io.netty.handler.codec.http.HttpObjectDecoder:HTTPデータのデコーダ
    io.netty.handler.codecのサブパケットでは、特殊な用途のための追加のエンコーダおよび復号が見出される.詳細はネティJavadocを参照してください.

    MessageToMessageDecoder抽象クラス


    抽象ベースクラスを使用してメッセージフォーマットを変換します(たとえば、POJOのフォーマットから別のフォーマットに変換します).
    「メソッド記述復号」(ChannelInboundContext ctx,Imsg,Listout)インバウンドメッセージを別のフォーマットに復号するたびに呼び出されます.復号されたメッセージは、パイプラインの次のChannelInboundHandlerに送信される.

    TooLongFrameExceptionクラス


    ネティは非同期フレームワークであるため、復号できるまでバイトメモリをバッファに格納する必要があります.また、デコーダにメモリが消費されるほどデータを格納させないでください.NettyにはTooLongFrameExceptionの例外があり、フレームが指定したサイズを超えている場合、この問題が発生します.

    エンコーダー


    エンコーダはChannelOutboundHandlerを実装し,あるフォーマットから別のフォーマットにアウトバウンドデータを変換し,前述したデコーダの機能を反転させる.ネティは、次の機能を持つエンコーダの作成をサポートします.
  • メッセージをバイト
  • に符号化する.
  • メッセージは、他のメッセージとして符号化される.
  • MessageToByteEncoder API
    方法説明符号化(ChannelHandlerContext Compx,Imsg,ByteBuf out)符号化方法は、ByteBufとして符号化されるアウトバウンドメッセージ(Iフォーマット)を伝達して呼び出す唯一の抽象的な方法である.その後、ByteBufはパイプライン内の次のChannelOutboundHandlerに渡される.
    MessageToMessage API
    方法は、エンコーダが唯一実現する必要がある方法であることを示す.write()で記録された各メッセージはencode()に符号化され、1つ以上のアウトバウンドメッセージに符号化される.次に、パイプライン内の次のChannelOutboundHandlerに渡されます.

    抽象符号化デコーダクラス


    これまで、デコーダおよびエンコーダは独立したエンティティであったが、場合によっては、1つのクラスがインバウンド/アウトバウンドデータおよびメッセージ変換を管理するのに非常に便利である.ネティの抽象符号化デコーダクラスは、デコーダ/エンコーダをペアに組み合わせて、これまで知られていた2つのタスクを共に処理するので、この用途に便利に使用することができる.これらのクラスはChannelInboundHandlerとChannelOutbundHandlerを同時に実現する.
    では、なぜデコーダやエンコーダを使用せずにこれらの複合クラスを使用しないのでしょうか.その理由は,コード再利用性と拡張性の2つの機能を分離し,内蒂の設計原則を最大限に向上させるためである.
    ByteToMessageCodec抽象クラス、MessageToMessageCodec抽象クラス

    CombinedChannelDupleHandlerクラス


    デコーダおよびエンコーダの欠如は、再利用性の低下をもたらすが、デコーダおよびエンコーダを単一のユニットに配置する利便性を放棄することなく、再利用性の低下を防止する方法がある.次の宣言の組合せChannelDupleHandlerを使用します.
    public class CombinedChannelDuplexHandler