Implemented new custom serialization
This commit is contained in:
61
kryonet/src/io/anuke/kryonet/ByteSerializer.java
Normal file
61
kryonet/src/io/anuke/kryonet/ByteSerializer.java
Normal 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();
|
||||
}
|
||||
}
|
||||
69
kryonet/src/io/anuke/kryonet/FrameworkSerializer.java
Normal file
69
kryonet/src/io/anuke/kryonet/FrameworkSerializer.java
Normal 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!");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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(){
|
||||
|
||||
@@ -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(){
|
||||
|
||||
Reference in New Issue
Block a user