应用程序通常需要执行比转换数据更加复杂的任务。例如,你可能需要处理格式不正确 的输入或者过量的数据。在下一个示例中,如果所读取的字节数超出了某个特定的限制,我 们将会抛出一个 TooLongFrameException。
这是一种经常用来防范资源被耗尽的方法。设定最大的帧大小已经被设置为 3 字节。如果一个帧的大小超出了该限制,那么程序将会丢弃它的字节,并抛出一个TooLongFrameException。位于 ChannelPipeline 中的其他 ChannelHandler 可以选择在exceptionCaught()方法中处理该异常或者忽略它。
package cn.enjoyedu.nettybasic.embedded;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.TooLongFrameException;
import java.util.List;
/**
* FrameChunkDecoder
*/
//扩展 ByteToMessageDecoder以将入站字节解码为消息
public class FrameChunkDecoder extends ByteToMessageDecoder {
private final int maxFrameSize;
//指定将要产生的帧的最大允许大小
public FrameChunkDecoder(int maxFrameSize) {
this.maxFrameSize = maxFrameSize;
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in,
List<Object> out)
throws Exception {
int readableBytes = in.readableBytes();
if (readableBytes > maxFrameSize) {
//如果该帧超出允许的大小,则丢弃它并抛出一个 TooLongFrameException……
in.clear();
throw new TooLongFrameException();
}
//……否则,从 ByteBuf 中读取一个新的帧
ByteBuf buf = in.readBytes(readableBytes);
//将该帧添加到解码 读取一个新的帧消息的 List 中
out.add(buf);
}
}