From aee752a112d5f8fffa120845d3a1383c079f6f43 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Mon, 26 Jun 2023 21:56:44 +0500 Subject: [PATCH] Add encoder --- .../core/network/LodServer.java | 16 ++++++++------- .../messageHandling/MessageHandlerSide.java | 6 ------ .../core/network/messages/HelloMessage.java | 6 +++--- .../core/network/messages/Message.java | 4 ++-- .../MessageDecoder.java | 6 +++--- .../core/network/protocol/MessageEncoder.java | 20 +++++++++++++++++++ .../MessageHandler.java | 2 +- .../network/protocol/MessageHandlerSide.java | 6 ++++++ .../MessageRegistry.java | 2 +- 9 files changed, 45 insertions(+), 23 deletions(-) delete mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandlerSide.java rename core/src/main/java/com/seibel/distanthorizons/core/network/{messageHandling => protocol}/MessageDecoder.java (80%) create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageEncoder.java rename core/src/main/java/com/seibel/distanthorizons/core/network/{messageHandling => protocol}/MessageHandler.java (92%) create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandlerSide.java rename core/src/main/java/com/seibel/distanthorizons/core/network/{messageHandling => protocol}/MessageRegistry.java (94%) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/LodServer.java b/core/src/main/java/com/seibel/distanthorizons/core/network/LodServer.java index 3673a0109..0866ecaa7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/LodServer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/LodServer.java @@ -1,9 +1,6 @@ package com.seibel.distanthorizons.core.network; -import com.seibel.distanthorizons.core.network.messageHandling.MessageDecoder; -import com.seibel.distanthorizons.core.network.messageHandling.MessageHandler; -import com.seibel.distanthorizons.core.network.messageHandling.MessageHandlerSide; -import com.seibel.distanthorizons.core.network.messageHandling.MessageRegistry; +import com.seibel.distanthorizons.core.network.protocol.*; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; @@ -12,8 +9,10 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; +import org.jetbrains.annotations.NotNull; public class LodServer { // TODO move to config of some sort @@ -47,15 +46,18 @@ public class LodServer { private ChannelInitializer getInitializer() { return new ChannelInitializer() { @Override - public void initChannel(SocketChannel ch) { + public void initChannel(@NotNull SocketChannel ch) { ChannelPipeline pipeline = ch.pipeline(); MessageRegistry messageRegistry = new MessageRegistry(); // Encoding - pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 2, 0, 2)); + pipeline.addLast(new LengthFieldBasedFrameDecoder(Short.MAX_VALUE, 0, Short.BYTES, 0, Short.BYTES)); pipeline.addLast(new MessageDecoder(messageRegistry)); - // TODO packet encoder + + // Encoder + pipeline.addLast(new LengthFieldPrepender(Short.BYTES)); + pipeline.addLast(new MessageEncoder(messageRegistry)); pipeline.addLast(new MessageHandler(MessageHandlerSide.SERVER)); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandlerSide.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandlerSide.java deleted file mode 100644 index 36eb6216c..000000000 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandlerSide.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.seibel.distanthorizons.core.network.messageHandling; - -public enum MessageHandlerSide { - CLIENT, - SERVER -} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/HelloMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/HelloMessage.java index e96673f95..d5b64398a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/HelloMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/HelloMessage.java @@ -5,17 +5,17 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; // This message is critical to maintain backwards compatibility -// as it's used to receive version BEFORE everything else. +// as it's used to receive version before everything else. public class HelloMessage extends Message { public int version = ModInfo.PROTOCOL_VERSION; @Override - public void encode(ByteBuf out) { + public void encode(ChannelHandlerContext ctx, ByteBuf out) { out.writeInt(version); } @Override - public void decode(ByteBuf in) { + public void decode(ChannelHandlerContext ctx, ByteBuf in) { version = in.readInt(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/Message.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/Message.java index 6be22c006..ac665966f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/Message.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/Message.java @@ -6,8 +6,8 @@ import io.netty.channel.ChannelHandlerContext; public abstract class Message { public Message() { } - public abstract void encode(ByteBuf out); - public abstract void decode(ByteBuf in); + public abstract void encode(ChannelHandlerContext ctx, ByteBuf out); + public abstract void decode(ChannelHandlerContext ctx, ByteBuf in); public void handle_Server(ChannelHandlerContext ctx) { throw new UnsupportedOperationException(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageDecoder.java b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageDecoder.java similarity index 80% rename from core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageDecoder.java rename to core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageDecoder.java index 0a35f4fc0..de2b4c7d1 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageDecoder.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageDecoder.java @@ -1,4 +1,4 @@ -package com.seibel.distanthorizons.core.network.messageHandling; +package com.seibel.distanthorizons.core.network.protocol; import com.seibel.distanthorizons.core.network.messages.Message; import io.netty.buffer.ByteBuf; @@ -8,7 +8,7 @@ import io.netty.handler.codec.ByteToMessageDecoder; import java.util.List; public class MessageDecoder extends ByteToMessageDecoder { - private MessageRegistry messageRegistry; + private final MessageRegistry messageRegistry; public MessageDecoder(MessageRegistry messageRegistry) { this.messageRegistry = messageRegistry; @@ -17,7 +17,7 @@ public class MessageDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) { Message message = messageRegistry.createMessage(in.readShort()); - message.decode(in); + message.decode(ctx, in); out.add(message); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageEncoder.java b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageEncoder.java new file mode 100644 index 000000000..43603e25a --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageEncoder.java @@ -0,0 +1,20 @@ +package com.seibel.distanthorizons.core.network.protocol; + +import com.seibel.distanthorizons.core.network.messages.Message; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +public class MessageEncoder extends MessageToByteEncoder { + private final MessageRegistry messageRegistry; + + public MessageEncoder(MessageRegistry messageRegistry) { + this.messageRegistry = messageRegistry; + } + + @Override + protected void encode(ChannelHandlerContext ctx, Message msg, ByteBuf out) throws IllegalArgumentException { + out.writeShort(messageRegistry.getMessageId(msg)); + msg.encode(ctx, out); + } +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandler.java similarity index 92% rename from core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandler.java rename to core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandler.java index 20817f27b..19ed385d7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandler.java @@ -1,4 +1,4 @@ -package com.seibel.distanthorizons.core.network.messageHandling; +package com.seibel.distanthorizons.core.network.protocol; import com.seibel.distanthorizons.core.network.messages.Message; import io.netty.channel.ChannelHandlerContext; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandlerSide.java b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandlerSide.java new file mode 100644 index 000000000..3e44e1642 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandlerSide.java @@ -0,0 +1,6 @@ +package com.seibel.distanthorizons.core.network.protocol; + +public enum MessageHandlerSide { + CLIENT, + SERVER +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageRegistry.java b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageRegistry.java similarity index 94% rename from core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageRegistry.java rename to core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageRegistry.java index 77b849501..f6f702461 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageRegistry.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageRegistry.java @@ -1,4 +1,4 @@ -package com.seibel.distanthorizons.core.network.messageHandling; +package com.seibel.distanthorizons.core.network.protocol; import com.seibel.distanthorizons.core.network.messages.HelloMessage; import com.seibel.distanthorizons.core.network.messages.Message;