Java Netty解码器-编码器错误
我有以下问题。每次我使用相同的en-and解码器从客户端向服务器发送数据包时,我的服务器控制台中都会出现以下错误:Java Netty解码器-编码器错误,java,netty,packet,encoder,decoder,Java,Netty,Packet,Encoder,Decoder,我有以下问题。每次我使用相同的en-and解码器从客户端向服务器发送数据包时,我的服务器控制台中都会出现以下错误: io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(72) + length(8) exceeds writerIndex(77): UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeNoClea
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
我的消息来源如下:
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);
}
}
}
}
编码器:
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);
}
}
导入net.rinet.rnclo.network.Packet;
导入net.rinet.rnclo.network.PacketRegistry;
导入io.netty.buffer.ByteBuf;
导入io.netty.channel.ChannelHandlerContext;
导入io.netty.handler.codec.MessageToByteEncoder;
导入lombok.allargsconstuctor;
导入lombok.noargsconstuctor;
/**
*JavaDoc这个文件!
*
*@作者帕斯卡
*@version 29.10.2017
*/
@AllArgsConstructor
@诺尔格构装师
公共类PacketEncoder扩展MessageToByteEncoder{
私人包裹登记处包裹登记处;
@凌驾
受保护的无效编码(ChannelHandlerContext ctx、数据包、ByteBuf输出)引发异常{
long id=this.packetRegistry.getPacketIdByClass(packet.getClass());
输出写长(id);
数据包写入(输出);
}
}
我的解码器是这样的:
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);
}
}
}
}
package net.rinet.rnclo.network.encoding;
导入net.rinet.rnclo.network.Packet;
导入net.rinet.rnclo.network.PacketRegistry;
导入io.netty.buffer.ByteBuf;
导入io.netty.channel.ChannelHandlerContext;
导入io.netty.handler.codec.ByteToMessageDecoder;
导入lombok.allargsconstuctor;
导入lombok.noargsconstuctor;
导入java.util.List;
/**
*JavaDoc这个文件!
*
*@作者帕斯卡
*@version 29.10.2017
*/
@AllArgsConstructor
@诺尔格构装师
公共类PacketDecoder扩展为tetomessagedecoder{
私人包裹登记处包裹登记处;
@凌驾
公共无效解码(ChannelHandlerContext ChannelHandlerContext、ByteBuf ByteBuf、List outputList)引发异常{
如果(byteBuf.isReadable(2)){
long id=byteBuf.readLong();
if(packetRegistry.checkPacketId(id)){
类您正在检查是否可以读取2个字节,然后读取8个字节
改变这个
if(byteBuf.isReadable(2)) {
long id = byteBuf.readLong();
到
您正在检查是否可以读取2个字节,然后读取8个字节
改变这个
if(byteBuf.isReadable(2)) {
long id = byteBuf.readLong();
到
给我看看你的ByteBuutils代码给我看看你的ByteBuutils代码多么愚蠢的错误…非常感谢你的帮助;)所以如果我取int,我需要将8位替换为4位,对吗?我是说字节sry:d什么愚蠢的错误…非常感谢你的帮助;)所以如果我取int,我需要将8位替换为4位,对吗?我是说bytes sry:d