Implemented new custom serialization

This commit is contained in:
Anuken
2018-01-16 23:30:24 -05:00
parent f6a465d917
commit b266516fad
16 changed files with 638 additions and 105 deletions

View File

@@ -0,0 +1,61 @@
package io.anuke.kryonet;
import com.badlogic.gdx.utils.reflect.ClassReflection;
import com.badlogic.gdx.utils.reflect.ReflectionException;
import com.esotericsoftware.kryonet.FrameworkMessage;
import com.esotericsoftware.kryonet.serialization.Serialization;
import io.anuke.mindustry.net.Packet;
import io.anuke.mindustry.net.Registrator;
import java.nio.ByteBuffer;
public class ByteSerializer implements Serialization {
@Override
public void write(ByteBuffer byteBuffer, Object o) {
if(o instanceof FrameworkMessage){
byteBuffer.put((byte)-2); //code for framework message
FrameworkSerializer.write(byteBuffer, (FrameworkMessage)o);
}else {
if (!(o instanceof Packet))
throw new RuntimeException("All sent objects must implement be Packets! Class: " + o.getClass());
byte id = Registrator.getID(o.getClass());
if (id == -1)
throw new RuntimeException("Unregistered class: " + ClassReflection.getSimpleName(o.getClass()));
byteBuffer.put(id);
((Packet) o).write(byteBuffer);
}
}
@Override
public Object read(ByteBuffer byteBuffer) {
try {
byte id = byteBuffer.get();
if(id == -2){
return FrameworkSerializer.read(byteBuffer);
}else {
Class<?> type = Registrator.getByID(id);
Packet packet = (Packet) ClassReflection.newInstance(type);
packet.read(byteBuffer);
return packet;
}
}catch (ReflectionException e){
throw new RuntimeException(e);
}
}
@Override
public int getLengthLength() {
return 2;
}
@Override
public void writeLength(ByteBuffer byteBuffer, int i) {
byteBuffer.putShort((short)i);
}
@Override
public int readLength(ByteBuffer byteBuffer) {
return byteBuffer.getShort();
}
}

View File

@@ -0,0 +1,69 @@
package io.anuke.kryonet;
import com.esotericsoftware.kryonet.FrameworkMessage;
import com.esotericsoftware.kryonet.FrameworkMessage.*;
import java.nio.ByteBuffer;
public class FrameworkSerializer {
public static void write(ByteBuffer buffer, FrameworkMessage message){
if(message instanceof Ping){
Ping p = (Ping)message;
buffer.put((byte)0);
buffer.putInt(p.id);
buffer.put(p.isReply ? 1 : (byte)0);
}else if(message instanceof DiscoverHost){
DiscoverHost p = (DiscoverHost)message;
buffer.put((byte)1);
}else if(message instanceof KeepAlive){
KeepAlive p = (KeepAlive)message;
buffer.put((byte)2);
}else if(message instanceof RegisterUDP){
RegisterUDP p = (RegisterUDP)message;
buffer.put((byte)3);
buffer.putInt(p.connectionID);
}else if(message instanceof RegisterTCP){
RegisterTCP p = (RegisterTCP)message;
buffer.put((byte)4);
buffer.putInt(p.connectionID);
}
}
public static FrameworkMessage read(ByteBuffer buffer){
byte id = buffer.get();
if(id == 0){
Ping p = new Ping();
p.id = buffer.getInt();
p.isReply = buffer.get() == 1;
return p;
}else if(id == 1){
DiscoverHost p = new DiscoverHost();
return p;
}else if(id == 2){
KeepAlive p = new KeepAlive();
return p;
}else if(id == 3){
RegisterUDP p = new RegisterUDP();
p.connectionID = buffer.getInt();
return p;
}else if(id == 4){
RegisterTCP p = new RegisterTCP();
p.connectionID = buffer.getInt();
return p;
}else{
throw new RuntimeException("Unknown framework message!");
}
}
}

View File

@@ -52,7 +52,7 @@ public class KryoClient implements ClientProvider{
}
};
client = new Client(8192, 2048);
client = new Client(8192, 2048, connection -> new ByteSerializer());
client.setDiscoveryHandler(handler);
Listener listener = new Listener(){
@@ -211,12 +211,7 @@ public class KryoClient implements ClientProvider{
}
@Override
public void register(Class<?>... types) {
for(Class<?> c : types){
client.getKryo().register(c);
}
KryoRegistrator.register(client.getKryo());
}
public void register(Class<?>... types) { }
@Override
public void dispose(){

View File

@@ -30,7 +30,7 @@ public class KryoServer implements ServerProvider {
IntArray connections = new IntArray();
public KryoServer(){
server = new Server(4096*2, 2048); //TODO tweak
server = new Server(4096*2, 2048, connection -> new ByteSerializer()); //TODO tweak
server.setDiscoveryHandler((datagramChannel, fromAddress) -> {
ByteBuffer buffer = KryoRegistrator.writeServerData();
UCore.log("Replying to discover request with buffer of size " + buffer.capacity());
@@ -107,7 +107,7 @@ public class KryoServer implements ServerProvider {
}
KickPacket p = new KickPacket();
p.reason = (byte)KickReason.kick.ordinal();
p.reason = KickReason.kick;
conn.sendTCP(p);
Timers.runTask(1f, () -> {
@@ -198,12 +198,7 @@ public class KryoServer implements ServerProvider {
}
@Override
public void register(Class<?>... types) {
for(Class<?> c : types){
server.getKryo().register(c);
}
KryoRegistrator.register(server.getKryo());
}
public void register(Class<?>... types) { }
@Override
public void dispose(){