DotNetty完全教程(十一)

编码器和解码器

定义

编码器负责将应用程序可以识别的数据结构转化为可传输的数据流,解码器反之。对于应用程序来说,编码器操作出站数据,解码器操作入站数据。

解码器和Handler

解码器因为是处理入站数据的,所以继承了ChannelInBoundHandler.我们理解的时候可以认为解码器就是一种特殊的Handler,用于处理信息。

解码器的类型

  • ByteToMessageDecoder
  • ReplayingDecoder
  • MessageToMessageDecoder

解码器实例

ByteToMessageDecoder

// ByteToMessageDecoder
public class ToIntDecoder : ByteToMessageDecoder
{
    protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List output)
    {
        if (input.ReadableBytes >= 4) output.Add(input.ReadInt());
    }
}
// 测试代码
[Fact]
public void TestIntDecoder()
{
    IByteBuffer buf = Unpooled.Buffer();
    for (int i = 0; i < 8; i++)
    {
        buf.WriteByte(i);
    }
    // 构建Channel
    EmbeddedChannel channel = new EmbeddedChannel(new ToIntDecoder());
    // 测试
    Assert.True(channel.WriteInbound(buf));
    Assert.True(channel.Finish());

    // 比如 0 1 2 3
    // 3*2^0+2*2^8+1*2^16+0*2^24
    Assert.Equal(66051, channel.ReadInbound());

}
 
  

ReplayingDecoder

// 不需要判断ReadableBytes的ReplayingDecoder
public class ToIntDecoder2 : ReplayingDecoder
{
    public ToIntDecoder2(int initialState) : base(initialState)
    {
    }

    protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List output)
    {
        output.Add(input.ReadInt());
    }
}
 
  

MessageToMessageDecoder

public class IntToStringDecoder : MessageToMessageDecoder
{
    protected override void Decode(IChannelHandlerContext context, int message, List output)
    {
        output.Add(message.ToString());
    }
}
 
  

更多解码器

  • LineBaseFrameDecoder 使用行尾控制符解析数据,可以把数据一行一行解析出来
  • HttpObjectDecoder HTTP解码器

编码器

根据我们之前的知识可以轻易的推导出,Encoder继承了ChannelOutBoundHandler

  • MessageToByteEncoder
  • MessageToMessageEncoder

编码器实例

MessageToByteEncoder

public class ShortToByteEncoder : MessageToByteEncoder
{
    protected override void Encode(IChannelHandlerContext context, short message, IByteBuffer output)
    {
        output.WriteShort(message);
    }
}

MessageToMessageEncoder

public class IntToStringEncoder : MessageToMessageEncoder
{
    protected override void Encode(IChannelHandlerContext context, int message, List output)
    {
        output.Add(message.ToString());
    }
}
 
  

编解码器

MessageToMessageCodec,它拥有encode和decode两个方法,用于实现来回的转换数据,这种编解码器我们在后面实例的时候再举例说明。
这种编解码器可以把数据的转换,逆转换过程封装,但是同时他的缺点是,不如分开写重用方便。那我们就会想了,既然如此的话,为什么我们不能把一个编码器,一个解码器结合起来,作为一个编解码器呢?这样的话,编码器解码器分别可以重用,结合出来的编解码器也可以方便的使用 CombinedChannelDuplexHandler 就可以实现这样的作用。

// 提供结合的编解码器
public class CombinedCodec : CombinedChannelDuplexHandler
{

}

你可能感兴趣的:(DotNetty,C#)