public class MyDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { // 实现自定义的解码逻辑,将字节数据解码为消息对象,并添加到out列表中 if (in.readableBytes() >= frameLength) { ByteBuf buf = in.readBytes(frameLength); out.add(buf); } } } public class MyHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { // 处理单一的入站消息对象msg } }
decode函数处理逻辑:先从in中读取数据(in的数据源就是可能是套接字的缓冲区或上游解码器)并分析出业务需要数据结构添加到列表类型的out参数,可以一次性输出到下游的ChannelInboundHandlerAdapter子类或者下游解码器
channelRead函数处理逻辑:从上游解码器或者普通handler读取数据,完成本次处理任务后
通过ctx.fireChannelRead(modifiedMessage)
将修改后的消息传递给下一个ChannelInboundHandler
。调试小知识:
1、只要解码其中ByteBuf buf = in.readBytes(frameLength)有一次读取成功,就会触发客户端的channel.writeInbound(input.readBytes(2))返回成功,否则channel.writeInbound返回的一直是false
2、一般情况下,
Assert.fail()
会被用于在测试中故意创建一个失败的条件,以便在该条件不满足时立即结束测试方法的执行3、buf.skipBytes(4).readSlice(3)可以读取ByteBuf buf = Unpooled.buffer()中写入的数据,buf.writeByte(i)可以向buf中写入数据
4、ByteBuf read = (ByteBuf) channel.readInbound() 读到的数据恰好是解码类中decode函数out列表的一个元素,可以用ByteBufUtil.hexDump(read)输出十六进制的数据,输出数据每两位占一个字节。
Netty学习笔记--ByteToMessageDecoder与ChannelInboundHandlerAdapter的关系
最新推荐文章于 2024-07-26 09:45:00 发布
本文介绍了Java中自定义的MyDecoder和MyHandler类,详细解释了decode方法如何解析字节数据为消息对象,以及channelRead方法如何处理单个入站消息。还分享了调试中的小知识,如ByteBuf的使用和测试技巧。
摘要由CSDN通过智能技术生成