From 7ee7f15f93670f730d98b1af63c75712f09a310d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 2 May 2020 16:04:03 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/protocol/io/NetInputStream.java | 2 +- .../io/coder}/ByteArrayNetInputStream.java | 6 ++-- .../{ => coder}/ByteArrayNetOutputStream.java | 4 ++- .../mc/protocol/io/coder/ProtocolDecoder.java | 5 +-- .../mc/protocol/io/coder/ProtocolEncoder.java | 1 - .../protocol/io/coder/ProtocolSplitter.java | 32 +++++++++++++++++++ .../mc/protocol/io/NetInputStreamTest.java | 1 + .../mc/protocol/io/NetOutputStreamTest.java | 2 ++ 8 files changed, 44 insertions(+), 9 deletions(-) rename src/{test/java/mc/protocol/io => main/java/mc/protocol/io/coder}/ByteArrayNetInputStream.java (90%) rename src/main/java/mc/protocol/io/{ => coder}/ByteArrayNetOutputStream.java (95%) create mode 100644 src/main/java/mc/protocol/io/coder/ProtocolSplitter.java diff --git a/src/main/java/mc/protocol/io/NetInputStream.java b/src/main/java/mc/protocol/io/NetInputStream.java index 44950af..8fabfec 100644 --- a/src/main/java/mc/protocol/io/NetInputStream.java +++ b/src/main/java/mc/protocol/io/NetInputStream.java @@ -49,7 +49,7 @@ public abstract class NetInputStream extends InputStream { byte[] bytes = new byte[length * 4]; int readbleBytes = 0; - for (int i = 0; i < length; i++) { + for (int i = 0; i < length && readableBytes() > 0; i++) { byte b = readByte(); bytes[readbleBytes++] = b; diff --git a/src/test/java/mc/protocol/io/ByteArrayNetInputStream.java b/src/main/java/mc/protocol/io/coder/ByteArrayNetInputStream.java similarity index 90% rename from src/test/java/mc/protocol/io/ByteArrayNetInputStream.java rename to src/main/java/mc/protocol/io/coder/ByteArrayNetInputStream.java index 9214dee..7785711 100644 --- a/src/test/java/mc/protocol/io/ByteArrayNetInputStream.java +++ b/src/main/java/mc/protocol/io/coder/ByteArrayNetInputStream.java @@ -1,8 +1,10 @@ -package mc.protocol.io; +package mc.protocol.io.coder; + +import mc.protocol.io.NetInputStream; import java.nio.ByteBuffer; -class ByteArrayNetInputStream extends NetInputStream { +public class ByteArrayNetInputStream extends NetInputStream { private final ByteBuffer byteBuffer; private int index = 0; diff --git a/src/main/java/mc/protocol/io/ByteArrayNetOutputStream.java b/src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java similarity index 95% rename from src/main/java/mc/protocol/io/ByteArrayNetOutputStream.java rename to src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java index b5192df..74893cc 100644 --- a/src/main/java/mc/protocol/io/ByteArrayNetOutputStream.java +++ b/src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java @@ -1,4 +1,6 @@ -package mc.protocol.io; +package mc.protocol.io.coder; + +import mc.protocol.io.NetOutputStream; import java.io.ByteArrayOutputStream; diff --git a/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java index b6fd920..55151e9 100644 --- a/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java @@ -10,9 +10,6 @@ public class ProtocolDecoder { private final PacketDirection direction; public Packet decode(State state, NetInputStream netInputStream) { - //TODO необходим механизм пропуска необработанных байтов - int sizePacket = netInputStream.readVarInt(); - int packetId = netInputStream.readVarInt(); Class packetClass = state.getPacketById(direction, packetId); if (packetClass == null) { @@ -20,7 +17,7 @@ public class ProtocolDecoder { UnknownPacket packet = new UnknownPacket( state, packetId, - sizePacket - Utils.sizeOfVarInt(packetId) + netInputStream.readableBytes() ); packet.readSelf(netInputStream); return packet; diff --git a/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java b/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java index 1f04d06..973cf8d 100644 --- a/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java @@ -4,7 +4,6 @@ import lombok.RequiredArgsConstructor; import mc.protocol.Packet; import mc.protocol.PacketDirection; import mc.protocol.State; -import mc.protocol.io.ByteArrayNetOutputStream; import mc.protocol.io.NetOutputStream; import java.util.Objects; diff --git a/src/main/java/mc/protocol/io/coder/ProtocolSplitter.java b/src/main/java/mc/protocol/io/coder/ProtocolSplitter.java new file mode 100644 index 0000000..360810a --- /dev/null +++ b/src/main/java/mc/protocol/io/coder/ProtocolSplitter.java @@ -0,0 +1,32 @@ +package mc.protocol.io.coder; + +import mc.protocol.io.NetInputStream; + +public class ProtocolSplitter { + + public NetInputStream split(NetInputStream netInputStream) { + netInputStream.markReadIndex(); + byte[] buff = new byte[3]; + + for (int i = 0; i < buff.length; ++i) { + buff[i] = netInputStream.readByte(); + + if (buff[i] >= 0) { + NetInputStream nis = new ByteArrayNetInputStream(buff); + int sizePacket = nis.readVarInt(); + + if (netInputStream.readableBytes() >= sizePacket) { + buff = new byte[sizePacket]; + netInputStream.readBytes(buff); + + return new ByteArrayNetInputStream(buff); + } + + netInputStream.resetReadIndex(); + break; + } + } + + return null; + } +} diff --git a/src/test/java/mc/protocol/io/NetInputStreamTest.java b/src/test/java/mc/protocol/io/NetInputStreamTest.java index 75e9cdb..1c1ccae 100644 --- a/src/test/java/mc/protocol/io/NetInputStreamTest.java +++ b/src/test/java/mc/protocol/io/NetInputStreamTest.java @@ -1,5 +1,6 @@ package mc.protocol.io; +import mc.protocol.io.coder.ByteArrayNetInputStream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/mc/protocol/io/NetOutputStreamTest.java b/src/test/java/mc/protocol/io/NetOutputStreamTest.java index f63a7e8..6f843ee 100644 --- a/src/test/java/mc/protocol/io/NetOutputStreamTest.java +++ b/src/test/java/mc/protocol/io/NetOutputStreamTest.java @@ -1,5 +1,7 @@ package mc.protocol.io; +import mc.protocol.io.coder.ByteArrayNetInputStream; +import mc.protocol.io.coder.ByteArrayNetOutputStream; import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test;