Skip to content

Instantly share code, notes, and snippets.

@Geolykt
Created September 4, 2021 13:55
Show Gist options
  • Save Geolykt/5dcc52dbb8e97c5c4cee81352e813778 to your computer and use it in GitHub Desktop.
Save Geolykt/5dcc52dbb8e97c5c4cee81352e813778 to your computer and use it in GitHub Desktop.
old ServerHandler code before rewrite to support large packets
package de.geolykt.galimp.prototype.server;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import de.geolykt.galimp.prototype.Side;
import de.geolykt.galimp.prototype.common.PacketProccessor;
import de.geolykt.galimp.prototype.server.packets.processing.JoinPacketProcessor;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class ServerHandler extends ChannelInboundHandlerAdapter {
protected final GalimulatorServer server;
protected final PacketProccessor[] packetProccessors;
public ServerHandler(GalimulatorServer galimulatorServer) {
this.server = galimulatorServer;
this.packetProccessors = new PacketProccessor[] {
new JoinPacketProcessor(server)
};
}
@Override
public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
server.getLogger().info("Read " + msg);
ByteBuf rawData = (ByteBuf) msg;
if (rawData.capacity() < 10) {
// prevent Buffer underflow
server.extension.getLogger().error("Unable to parse packet (buffer underflow): " + Arrays.toString(rawData.array()) + ". Packet ignored.");
return;
}
ByteBuffer readData = rawData.nioBuffer();
long sourceClient = readData.getLong();
short packetId = readData.getShort();
if (packetProccessors.length <= packetId || packetId < 0) {
// prevent potential AIOBE
server.extension.getLogger().warn("Ignoring packet from client " + sourceClient + " as it is using an unsupported packetId (" + packetId + ").");
return;
}
packetProccessors[packetId].process(Side.CLIENT, sourceClient, readData);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
server.getLogger().error("Error in Server NIO. Closing channel", cause);
ctx.close();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment