应用程序通常需要执行比转换数据更加复杂的任务。例如,你可能需要处理格式不正确 的输入或者过量的数据。在下一个示例中,如果所读取的字节数超出了某个特定的限制,我 们将会抛出一个 TooLongFrameException。
    这是一种经常用来防范资源被耗尽的方法。设定最大的帧大小已经被设置为 3 字节。如果一个帧的大小超出了该限制,那么程序将会丢弃它的字节,并抛出一个TooLongFrameException。位于 ChannelPipeline 中的其他 ChannelHandler 可以选择在exceptionCaught()方法中处理该异常或者忽略它。

    1. package cn.enjoyedu.nettybasic.embedded;
    2. import io.netty.buffer.ByteBuf;
    3. import io.netty.channel.ChannelHandlerContext;
    4. import io.netty.handler.codec.ByteToMessageDecoder;
    5. import io.netty.handler.codec.TooLongFrameException;
    6. import java.util.List;
    7. /**
    8. * FrameChunkDecoder
    9. */
    10. //扩展 ByteToMessageDecoder以将入站字节解码为消息
    11. public class FrameChunkDecoder extends ByteToMessageDecoder {
    12. private final int maxFrameSize;
    13. //指定将要产生的帧的最大允许大小
    14. public FrameChunkDecoder(int maxFrameSize) {
    15. this.maxFrameSize = maxFrameSize;
    16. }
    17. @Override
    18. protected void decode(ChannelHandlerContext ctx, ByteBuf in,
    19. List<Object> out)
    20. throws Exception {
    21. int readableBytes = in.readableBytes();
    22. if (readableBytes > maxFrameSize) {
    23. //如果该帧超出允许的大小,则丢弃它并抛出一个 TooLongFrameException……
    24. in.clear();
    25. throw new TooLongFrameException();
    26. }
    27. //……否则,从 ByteBuf 中读取一个新的帧
    28. ByteBuf buf = in.readBytes(readableBytes);
    29. //将该帧添加到解码 读取一个新的帧消息的 List 中
    30. out.add(buf);
    31. }
    32. }