netty(九)--编解码器

	编码器用于将消息转换为适合于传输的格式,解码器则是将网络字节流转换回应用程序的消息格式。

解码器

  • 将字节解码为消息–ByteToMessageDecoder和RelayingDecoder
  • 将消息解码为另一种消息–MessageToMessageDecoder
ByteToMessageDecoder
方法 描述
decode(ChannelHandlerContext ctx,ByteBuf in,List< Object> out) 这是你必须实现的唯一抽象方法,该方法被调用时将会传入一个包含了传入数据的ByteBuf ,以及一个用来添加解码消息的List。对这个方法的调用将会重复进行,直到确定没有新的元素被添加到该List,或者ByteBuf中没有更多可读取的字节时为止。然后如果List不为空,则将内容传递给ChannelPipeline中的下一个ChannelInboundHandler.
decodeLast(ChannelHandlerContext ctx,ByteBuf in,List< Object> out) 默认实现只简单调用了decode方法,当channel变为非活动时,这个方法会被调用一次
ReplayingDecoder

ReplayingDecoder继承于ByteToMessageDecoder

  • ReplayingDecoder稍慢于ByteToMessageDecoder
  • ReplayingDecoderByteBuf不完全支持ByteBuf的所有操作

ReplayingDecoder在decode时,如果抛出Error,将在基类中捕获处理,当有更多消息可供读取时,decode方法将被再次调用。

MessageToMessageDecoder
方法 描述
decode(ChannelHandlerContext ctx,I msg,List< Object> out 对于每个需要被解码为另一种格式的入站消息来说,这个方法都会被调用。

编码器

MessageToByteEncoder
方法 描述
encode(ChannelHandlerContext ctx,I msg,ByteBuf out encode方法是你唯一需要实现的抽象方法。接收传入消息msg,传出out。会传递给下一个ChannelOutboundHandler

在这里插入图片描述

MessageToMessageEncoder

将出站数据从一种消息编码为另一种。

方法 描述
encode(ChannelHandlerContext ctx,I msg,List< Object> out encode方法是你唯一需要实现的抽象方法。每次write都会传递给encode方法,传出out,以编码为一个或多个出站消息。随后会传递给下一个ChannelOutboundHandler

ByteToMessageCodec
在这里插入图片描述

MessageToMessageCodec方法:

在这里插入图片描述


在一个handler中同时写编码和解码方法,不利于代码的重用。netty提供了CombinedChannelDuplexHandler类实现上述相同的功能。
声明如下:

public class CombinedChannelDuplexHandler
<I extends ChannelInboundHandler,
O extends ChannelOutboundHandler>

一种使用方式:

public class CombinedByteCharCodec extends
CombinedChannelDuplexHandler<ByteToCharDecoder, CharToByteEncoder> {
	public CombinedByteCharCodec() {
		super(new ByteToCharDecoder(), new CharToByteEncoder());
	}
}

待续。。。

猜你喜欢

转载自blog.csdn.net/ljz2016/article/details/82969872