netty自定义解码器

netty中要实现自定义解码器,常规做法就是实现decode方法(ByteToMessageDecoder抽象类中)

ByteToMessageDecoder.java源码

由注释得出,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());
        }

      }

  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容