6

6.1 解码器

6.1.1 抽象类-ByteToMessageDecoder

decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)

a). 必须实现的抽象方法,调用时传入包含数据的ByteBuf,一个添加解码消息的List, 对这个方法的调用会重复进行,直到byteBuf中没有可读取的数据。
b). 如果list不为空,那么内容会循环传递给下一个ChannelInBoundHandler

class DecodeTest extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
		//此处不需要while循环
        if( in.readableBytes()>=4 ){
            out.add(in.readInt());
        }
    }
}

6.1.2 抽象类ReplayingDecoder-慢,简单

public abstract class ReplayingDecoder<S> extends ByteToMessageDecoder 	//S指定了用于状态管理的类型,可void

a). 扩展了ByteToMessageDecoder,不必调用readableBytes()方法,通过使用自定义的ReplayingDecoderBuf包装ByteBuf实现。
b). 如果没有足够的字节可用,readInt抛出一个error被基类捕获并处理。当有更多数据时,decode方法将再次被调用

class ReplayingDecoderTest extends ReplayingDecoder<Void>{
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        out.add(in.readInt());
    }
}

6.1.3 预置的解码器

LineBasedFrameDecoder	//行位控制符
或
来解析消息
HttpObjectDecoder		//一个HTTP的解码器

6.1.3 Message

//对么个消息调用decode方法
class MessageToMessageDecoderTest extends MessageToMessageDecoder{
    @Override
    protected void decode(ChannelHandlerContext ctx, Object msg, List out) throws Exception {
        out.add(String.valueOf(msg));
    }
}

6.2 编码器-encode-MessageToBytEncoder/MessageToMessageEncoder

原文地址:https://www.cnblogs.com/Desneo/p/7326671.html