编码器用于将消息转换为适合于传输的格式,解码器则是将网络字节流转换回应用程序的消息格式。
解码器
- 将字节解码为消息–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());
}
}
待续。。。