netty中要实现自定义解码器,常规做法就是实现decode方法(ByteToMessageDecoder抽象类中)
由注释得出,
ByteBuf 类型的 in
为通道中的字节流数据,而需要传解码后的数据给通道中其他的处理器使用,则需要将其添加到List<Object> 列表的 out
中,通俗来说。解码后需要给后面处理器使用的数据,使用out.add(obj)的方式来传递。
我写一篇博客当然不是闲得蛋疼来翻译这段注释,而是这中间有个重要的点要记住!!!
注释中说:
This method will be called till either the input ByteBuf has nothing to read when return from this method or till nothing was read from the input ByteBuf.
译:这个方法会一直调用,直到从这个方法返回的时候,输入的ByteBuf
已经没有东西可以读了,或者输入的ByteBuf中没有东西可读
意思就是说,如果传入的ByteBuf对象读指针后面任然有数据可以读,那么这个方法就会继续调用(重新执行该方法),直到该方法执行完后ByteBuf的读指针后面已经没有数据了。
因为在实际业务中可能会遇到,读到无效数据不需要再继续解码传递给后面处理器使用的情况。那么这个时候也应该将读指针标记到ByteBuf最后的位置,同时不向out
中添加数据(就不会触发channel中其他的处理器)。
public class CustomDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
if (in.readableBytes() < 8) {
//不做处理,但前面的字节仍会留在通道中
return;
}
//命令头对不上,视为无效数据,直接放弃
if (in.readChar() != 0x565A) {
in.readBytes(in.readableBytes());
}
}
}