DotNetty完全教程(十一)

mac2024-05-22  29

编码器和解码器

定义

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

解码器和Handler

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

解码器的类型

ByteToMessageDecoderReplayingDecoderMessageToMessageDecoder

解码器实例

ByteToMessageDecoder

// ByteToMessageDecoder public class ToIntDecoder : ByteToMessageDecoder { protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List<object> 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<int>()); }

ReplayingDecoder

// 不需要判断ReadableBytes的ReplayingDecoder public class ToIntDecoder2 : ReplayingDecoder<int> { public ToIntDecoder2(int initialState) : base(initialState) { } protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List<object> output) { output.Add(input.ReadInt()); } }

MessageToMessageDecoder

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

更多解码器

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

编码器

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

MessageToByteEncoderMessageToMessageEncoder

编码器实例

MessageToByteEncoder

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

MessageToMessageEncoder

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

编解码器

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

// 提供结合的编解码器 public class CombinedCodec : CombinedChannelDuplexHandler<ToIntDecoder, ShortToByteEncoder> { }
最新回复(0)