decode() did not read anything but decoded a message(Decode()没有读取任何内容,但解码了一条消息)
本文介绍了Decode()没有读取任何内容,但解码了一条消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
对于套接字服务器应用程序,我创建了一个PacketFragmenter,它读取包的长度(在包的第二个字节中),然后将包发送回管道。
这是我写的代码:
public class PacketFragmenter extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in,
List<Object> out) throws Exception {
//I read a byte just to make the reader index go to second byte
in.readByte();
//in the second byte i get the content's length
int length = in.readByte();
//if my content is smaller than the readableBytes, there's a problem, so i return
if (in.readableBytes() < length) {
return;
}
//If everything is good, i reset the reader index to be able to write the whole packet in the out buffer (because i need the first byte in next handler, same for the size)
in.resetReaderIndex();
//I send my packet to the next handler
out.add(in.readBytes(length +2));
//and i reset the rederIndex to be able to read another packet
in.resetReaderIndex();
}
}
我在测试中得到了这个堆栈:
io.netty.handler.codec.DecoderException: PacketFragmenter.decode() did not read anything but decoded a message.
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:334)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:229)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:339)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:324)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:847)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:745)
但一切正常,我收到了连续的两个包,但它们拼接得很好,下一个操作员正在做他的工作。
所以我不知道应该处理此异常还是忽略它?或者我可以做一件简单的事情来修复它,我根本不是一个网络专家(一周前开始的),所以这应该很容易修复。但我在Netty的用户指南上什么也没有找到。
推荐答案
public class PacketFrameDecoder extends LengthFieldBasedFrameDecoder {
private static final int MAX_PACKET_LENGTH = 8192 * 2;
private static final int LENGTH_FIELD_OFFSET = 1;
private static final int LENGTH_FIELD_LENGTH = 1;
private static final int LENGTH_FIELD_ADJUSTMENT = 0;
private static final int INITIAL_BYTES_TO_STRIP = 0;
public PacketFrameDecoder()
{
super(MAX_PACKET_LENGTH, LENGTH_FIELD_OFFSET, LENGTH_FIELD_LENGTH, LENGTH_FIELD_ADJUSTMENT, INITIAL_BYTES_TO_STRIP);
}
@Override
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception
{
return super.decode(ctx, in);
}
}
以下是我如何修复它的,事实上有一个LengthFieldBasedFrameDecoder为它做了,不需要扩展ByteToMessageDecoder。
这篇关于Decode()没有读取任何内容,但解码了一条消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:Decode()没有读取任何内容,但解码了一条消息


基础教程推荐
猜你喜欢
- 使用堆栈算法进行括号/括号匹配 2022-01-01
- 存储 20 位数字的数据类型 2022-01-01
- Spring AOP错误无法懒惰地为此建议构建thisJoinPoin 2022-09-13
- 修改 void 函数的输入参数,然后读取 2022-01-01
- Struts2 URL 无法访问 2022-01-01
- 如何对 Java Hashmap 中的值求和 2022-01-01
- 问题http://apache.org/xml/features/xinclude测试日志4j 2 2022-01-01
- RabbitMQ:消息保持“未确认"; 2022-01-01
- 无法复制:“比较方法违反了它的一般约定!" 2022-01-01
- REST Web 服务返回 415 - 不支持的媒体类型 2022-01-01