package com.github.czyzby;
import com.github.czyzby.shared.serialization.Packets;
import com.github.czyzby.shared.serialization.ServerResponse;
import com.github.czyzby.websocket.serialization.impl.JsonSerializer;
import com.github.czyzby.websocket.serialization.impl.ManualSerializer;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.ServerWebSocket;
import io.vertx.core.http.WebSocketFrame;
// Note that server web socket implementation is not provided by gdx-websocket. This class uses an external library: Vert.x.
public class ServerLauncher {
private final Vertx vertx = Vertx.vertx();
private final ManualSerializer serializer;
private final JsonSerializer jsonSerializer;
public ServerLauncher() {
serializer = new ManualSerializer();
Packets.register(serializer);
jsonSerializer = new JsonSerializer();
}
public static void main(final String... args) throws Exception {
new ServerLauncher().launch();
}
private void launch() {
System.out.println("Launching web socket server...");
HttpServer server = vertx.createHttpServer();
server.websocketHandler(webSocket -> {
// String test:
webSocket.frameHandler(frame -> handleStringFrame(webSocket, frame));
}).listen(8000);
server = vertx.createHttpServer();
server.websocketHandler(webSocket -> {
// JSON test:
webSocket.frameHandler(frame -> handleJsonFrame(webSocket, frame));
}).listen(8001);
server = vertx.createHttpServer();
server.websocketHandler(webSocket -> {
// Serialization test:
webSocket.frameHandler(frame -> handleSerializationFrame(webSocket, frame));
}).listen(8002);
}
private static void handleStringFrame(final ServerWebSocket webSocket, final WebSocketFrame frame) {
final String response = "Packet had " + frame.binaryData().length()
+ " bytes. Cannot deserialize packet class.";
System.out.println(response);
webSocket.writeFinalTextFrame(response);
}
private void handleJsonFrame(final ServerWebSocket webSocket, final WebSocketFrame frame) {
final byte[] packet = frame.binaryData().getBytes();
final long start = System.nanoTime();
final Object deserialized = jsonSerializer.deserialize(packet);
final long time = System.nanoTime() - start;
final com.github.czyzby.shared.json.ServerResponse response = new com.github.czyzby.shared.json.ServerResponse();
response.message = "Packet had " + packet.length + " bytes. Class: " + deserialized.getClass().getSimpleName()
+ ", took " + time + " nanos to deserialize.";
System.out.println(response.message);
final byte[] serialized = jsonSerializer.serialize(response);
webSocket.writeFinalBinaryFrame(Buffer.buffer(serialized));
}
private void handleSerializationFrame(final ServerWebSocket webSocket, final WebSocketFrame frame) {
final byte[] packet = frame.binaryData().getBytes();
final long start = System.nanoTime();
final Object deserialized = serializer.deserialize(packet);
final long time = System.nanoTime() - start;
final ServerResponse response = new ServerResponse("Packet had " + packet.length + " bytes. Class: "
+ deserialized.getClass().getSimpleName() + ", took " + time + " nanos to deserialize.");
System.out.println(response.getMessage());
final byte[] serialized = serializer.serialize(response);
webSocket.writeFinalBinaryFrame(Buffer.buffer(serialized));
}
}