【问题标题】:Netty Decoder Encoder ErrorNetty 解码器编码器错误
【发布时间】:2018-04-12 02:55:30
【问题描述】:

我有以下问题。每次当我使用相同的编码器和解码器从客户端向服务器发送数据包时,都会在服务器控制台中收到以下错误:

    io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(72) + length(8) exceeds writerIndex(77): UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeNoCleanerDirectByteBuf(ridx: 72, widx: 77, cap: 1024)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:461)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:356)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:342)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:335)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1294)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:356)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:342)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:911)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
        at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
        at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IndexOutOfBoundsException: readerIndex(72) + length(8) exceeds writerIndex(77): UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeNoCleanerDirectByteBuf(ridx: 72, widx: 77, cap: 1024)
        at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1168)
        at io.netty.buffer.AbstractByteBuf.readLong(AbstractByteBuf.java:651)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:27)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at net.rinet.rnclo.network.encoding.PacketDecoder.decode(PacketDecoder.java:39)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:491)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:430)
        ... 16 more

我的来源是这样的:

编码器:

import net.rinet.rnclo.network.Packet;
import net.rinet.rnclo.network.PacketRegistry;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

/**
 * JavaDoc this file!
 *
 * @author Pascal
 * @version 29.10.2017
 */
@AllArgsConstructor
@NoArgsConstructor
public class PacketEncoder extends MessageToByteEncoder<Packet> {
    private PacketRegistry packetRegistry;

    @Override
    protected void encode(ChannelHandlerContext ctx, Packet packet, ByteBuf output) throws Exception {
        long id = this.packetRegistry.getPacketIdByClass(packet.getClass());
        output.writeLong(id);
        packet.write(output);
    }
}

我的解码器看起来像这样:

package net.rinet.rnclo.network.encoding;

import net.rinet.rnclo.network.Packet;
import net.rinet.rnclo.network.PacketRegistry;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * JavaDoc this file!
 *
 * @author Pascal
 * @version 29.10.2017
 */
@AllArgsConstructor
@NoArgsConstructor
public class PacketDecoder extends ByteToMessageDecoder {
    private PacketRegistry packetRegistry;

    @Override
    public void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> outputList) throws Exception {
        if(byteBuf.isReadable(2)) {
            long id = byteBuf.readLong();

            if(packetRegistry.checkPacketId(id)) {
                Class<? extends Packet> packetClass = packetRegistry.getPacketClassById(id);
                Packet receivedPacket = packetClass.newInstance();
                try {
                    receivedPacket.read(byteBuf);
                } catch (Throwable t) {
                    t.printStackTrace();
                }
                outputList.add(receivedPacket);
            } else {
                decode(channelHandlerContext, byteBuf, outputList);
            }
        }
    }
}

我的数据包看起来像这样:https://hastebin.com/atirenevuw.java

每一个有用的答案我都非常高兴! 帕斯卡

【问题讨论】:

  • 给我看你的 ByteBufUtils 代码

标签: java netty packet encoder decoder


【解决方案1】:

您正在检查是否可以读取 2 个字节,但随后您读取了 8 个字节。

改变这个

        if(byteBuf.isReadable(2)) {
            long id = byteBuf.readLong();

        if(byteBuf.isReadable(8)) {
            long id = byteBuf.readLong();

【讨论】:

  • 多么愚蠢的错误......非常感谢您的帮助;)
  • 所以如果我取int,我需要将8位替换为4位,对吗?
  • 我的意思是字节sry:d
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多