前言
netty学习系列笔记总结,解码器抽象父类-ByteToMessageDecoder源码浅析,错误之处欢迎指正, 共同学习
累加字节流
1 | public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { |
1 | private Cumulator cumulator = MERGE_CUMULATOR; |
调用子类的decode方法进行解析
1 | protected void callDecode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { |
1 | 该方法主要逻辑:只要累积区还有未读数据,就循环进行读取。 |
将解析到的ByteBuf向下传播
1 | public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { |
总结
解码的主要逻辑就是将所有的数据全部放入累积区,子类从累积区取出数据进行解码后放入到一个 数组中,ByteToMessageDecoder 会循环数组调用后面的 handler 方法,将数据一帧帧的发送到业务 handler 。完成这个的解码逻辑。
可以说,ByteToMessageDecoder 是解码器的核心,Netty 所有的解码器,都可以在此类上扩展,一切取决于 decode 的实现。只要遵守 ByteToMessageDecoder 的约定即可。