深入浅出Netty源码剖析程序员Java学习笔记

Netty4(四):Codec 编码与解码

2018-03-28  本文已影响138人  聪明的奇瑞

什么是 Codec

Decoder(解码器)

ByteToMessageDecoder

public class ToIntegerDecoder extends ByteToMessageDecoder {  

    @Override
    public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)
            throws Exception {
        if (in.readableBytes() >= 4) {  
            out.add(in.readInt());  
        }
    }
}

ReplayingDecoder

public class ToIntegerDecoder2 extends ReplayingDecoder<Void> {   

    @Override
    public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)
            throws Exception {
        out.add(in.readInt());  
    }
}

MessageToMessageDecoder

public class IntegerToStringDecoder extends
        MessageToMessageDecoder<Integer> { 

    @Override
    public void decode(ChannelHandlerContext ctx, Integer msg, List<Object> out)
            throws Exception {
        out.add(String.valueOf(msg)); 
    }
}

解码时处理太大的帧

public class SafeByteToMessageDecoder extends ByteToMessageDecoder { 
    private static final int MAX_FRAME_SIZE = 1024;

    @Override
    public void decode(ChannelHandlerContext ctx, ByteBuf in,
                       List<Object> out) throws Exception {
        int readable = in.readableBytes();
        if (readable > MAX_FRAME_SIZE) { 
            in.skipBytes(readable);        
            throw new TooLongFrameException("Frame too big!");
        }
    }
}

Encoder(编码器)

MessageToByteEncoder

public class ShortToByteEncoder extends MessageToByteEncoder<Short> {  
    @Override
    public void encode(ChannelHandlerContext ctx, Short msg, ByteBuf out) throws Exception {
        out.writeShort(msg);  
    }
}

MessageToMessageEncoder

public class IntegerToStringEncoder extends MessageToMessageEncoder<Integer> { 
    @Override
    public void encode(ChannelHandlerContext ctx, Integer msg, List<Object> out) throws Exception {
        out.add(String.valueOf(msg));  
    }
}

Decoder / Encoder

上一篇 下一篇

猜你喜欢

热点阅读