package com.github.czyzby;
import com.github.czyzby.shared.MyPackets;
import com.github.czyzby.shared.Ping;
import com.github.czyzby.shared.Pong;
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;
public ServerLauncher() {
serializer = new ManualSerializer();
MyPackets.register(serializer);
}
public static void main(final String... args) throws Exception {
new ServerLauncher().launch();
}
private void launch() {
System.out.println("Launching web socket server...");
final HttpServer server = vertx.createHttpServer();
server.websocketHandler(webSocket -> {
// Printing received packets to console, sending response:
webSocket.frameHandler(frame -> handleFrame(webSocket, frame));
}).listen(8000);
}
private void handleFrame(final ServerWebSocket webSocket, final WebSocketFrame frame) {
// Deserializing received message:
final Object request = serializer.deserialize(frame.binaryData().getBytes());
System.out.println("Received packet: " + request);
// Sending a response - Ping to Pong, Pong to Ping.
if (request instanceof Ping) {
final Pong response = new Pong();
response.setValue(((Ping) request).getValue() / 2f);
response.setServer(true);
webSocket.writeFinalBinaryFrame(Buffer.buffer(serializer.serialize(response)));
} else if (request instanceof Pong) {
final Ping response = new Ping();
response.setValue((int) ((Pong) request).getValue() * 2);
response.setClient(false);
webSocket.writeFinalBinaryFrame(Buffer.buffer(serializer.serialize(response)));
}
}
}