feat: Finallized communication
This commit is contained in:
2
.idea/FuzzierSettings.xml
generated
2
.idea/FuzzierSettings.xml
generated
@@ -9,6 +9,6 @@
|
|||||||
<entry key="server" value="$PROJECT_DIR$" />
|
<entry key="server" value="$PROJECT_DIR$" />
|
||||||
</map>
|
</map>
|
||||||
</option>
|
</option>
|
||||||
<option name="recentlySearchedFiles" value="rO0ABXNyABxqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsBgfGCGLvV2ICAAFMAAhkZWxlZ2F0ZXQAEkxqYXZhL3V0aWwvVmVjdG9yO3hyAB1qYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbFrW+oYSs63tAgABTAAMbGlzdGVuZXJMaXN0dAAlTGphdmF4L3N3aW5nL2V2ZW50L0V2ZW50TGlzdGVuZXJMaXN0O3hwc3IAI2phdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0kUjMLXPfDt4DAAB4cHB4c3IAEGphdmEudXRpbC5WZWN0b3LZl31bgDuvAQMAA0kAEWNhcGFjaXR5SW5jcmVtZW50SQAMZWxlbWVudENvdW50WwALZWxlbWVudERhdGF0ABNbTGphdmEvbGFuZy9PYmplY3Q7eHAAAAAAAAAAAXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAApzcgBIY29tLm1pdHV1ei5mdXp6aWVyLmVudGl0aWVzLkZ1enp5TWF0Y2hDb250YWluZXIkU2VyaWFsaXplZE1hdGNoQ29udGFpbmVy2S8sP5uny74CAARMAAhmaWxlUGF0aHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACGZpbGVuYW1lcQB+AA1MAA5tb2R1bGVCYXNlUGF0aHEAfgANTAAFc2NvcmV0ADxMY29tL21pdHV1ei9mdXp6aWVyL2VudGl0aWVzL0Z1enp5TWF0Y2hDb250YWluZXIkRnV6enlTY29yZTt4cHQARC9nYW1lL3NyYy9tYWluL2phdmEvY3ovanppdG5pay9jbGllbnQvdXRpbHMvZXZlbnRzL0V2ZW50TWFuYWdlci5qYXZhdAARRXZlbnRNYW5hZ2VyLmphdmF0ABYvaG9tZS9rdWJhL0NvZGluZy9nYW1lc3IAOmNvbS5taXR1dXouZnV6emllci5lbnRpdGllcy5GdXp6eU1hdGNoQ29udGFpbmVyJEZ1enp5U2NvcmUvP9P07ROG2QIABUkADWZpbGVuYW1lU2NvcmVJAA9tdWx0aU1hdGNoU2NvcmVJABBwYXJ0aWFsUGF0aFNjb3JlSQALc3RyZWFrU2NvcmVMABNoaWdobGlnaHRDaGFyYWN0ZXJzdAAPTGphdmEvdXRpbC9TZXQ7eHAAAAAIAAAAAAAAAAAAAAADc3IAEWphdmEudXRpbC5IYXNoU2V0ukSFlZa4tzQDAAB4cHcMAAAAED9AAAAAAAAIc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAABzcQB+ABgAAAABc3EAfgAYAAAAAnNxAH4AGAAAAANzcQB+ABgAAAAEc3EAfgAYAAAABXNxAH4AGAAAAAZzcQB+ABgAAAAHeHBwcHBwcHBwcHg=" />
|
<option name="recentlySearchedFiles" value="rO0ABXNyABxqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsBgfGCGLvV2ICAAFMAAhkZWxlZ2F0ZXQAEkxqYXZhL3V0aWwvVmVjdG9yO3hyAB1qYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbFrW+oYSs63tAgABTAAMbGlzdGVuZXJMaXN0dAAlTGphdmF4L3N3aW5nL2V2ZW50L0V2ZW50TGlzdGVuZXJMaXN0O3hwc3IAI2phdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0kUjMLXPfDt4DAAB4cHB4c3IAEGphdmEudXRpbC5WZWN0b3LZl31bgDuvAQMAA0kAEWNhcGFjaXR5SW5jcmVtZW50SQAMZWxlbWVudENvdW50WwALZWxlbWVudERhdGF0ABNbTGphdmEvbGFuZy9PYmplY3Q7eHAAAAAAAAAABHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAApzcgBIY29tLm1pdHV1ei5mdXp6aWVyLmVudGl0aWVzLkZ1enp5TWF0Y2hDb250YWluZXIkU2VyaWFsaXplZE1hdGNoQ29udGFpbmVy2S8sP5uny74CAARMAAhmaWxlUGF0aHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACGZpbGVuYW1lcQB+AA1MAA5tb2R1bGVCYXNlUGF0aHEAfgANTAAFc2NvcmV0ADxMY29tL21pdHV1ei9mdXp6aWVyL2VudGl0aWVzL0Z1enp5TWF0Y2hDb250YWluZXIkRnV6enlTY29yZTt4cHQARC9nYW1lL3NyYy9tYWluL2phdmEvY3ovanppdG5pay9jbGllbnQvdXRpbHMvZXZlbnRzL0V2ZW50TWFuYWdlci5qYXZhdAARRXZlbnRNYW5hZ2VyLmphdmF0ABYvaG9tZS9rdWJhL0NvZGluZy9nYW1lc3IAOmNvbS5taXR1dXouZnV6emllci5lbnRpdGllcy5GdXp6eU1hdGNoQ29udGFpbmVyJEZ1enp5U2NvcmUvP9P07ROG2QIABUkADWZpbGVuYW1lU2NvcmVJAA9tdWx0aU1hdGNoU2NvcmVJABBwYXJ0aWFsUGF0aFNjb3JlSQALc3RyZWFrU2NvcmVMABNoaWdobGlnaHRDaGFyYWN0ZXJzdAAPTGphdmEvdXRpbC9TZXQ7eHAAAAAMAAAAAAAAAAoAAAAHc3IAEWphdmEudXRpbC5IYXNoU2V0ukSFlZa4tzQDAAB4cHcMAAAAED9AAAAAAAAMc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAABzcQB+ABgAAAABc3EAfgAYAAAAAnNxAH4AGAAAAANzcQB+ABgAAAAEc3EAfgAYAAAABXNxAH4AGAAAAAZzcQB+ABgAAAAHc3EAfgAYAAAACHNxAH4AGAAAAAlzcQB+ABgAAAAKc3EAfgAYAAAAC3hzcQB+AAx0AEQvZ2FtZS9zcmMvbWFpbi9qYXZhL2N6L2p6aXRuaWsvY2xpZW50L3NvY2tldC9Tb2NrZXRFdmVudE1hbmFnZXIuamF2YXQAF1NvY2tldEV2ZW50TWFuYWdlci5qYXZhdAAWL2hvbWUva3ViYS9Db2RpbmcvZ2FtZXNxAH4AEwAAABEAAAAAAAAAAAAAAApzcQB+ABZ3DAAAACA/QAAAAAAAEXEAfgAacQB+ABtxAH4AHHEAfgAdcQB+AB5xAH4AH3EAfgAgcQB+ACFxAH4AInEAfgAjcQB+ACRxAH4AJXNxAH4AGAAAAAxzcQB+ABgAAAANc3EAfgAYAAAADnNxAH4AGAAAAA9zcQB+ABgAAAAQeHNxAH4ADHQADS9nYW1lL3BvbS54bWx0AAdwb20ueG1sdAAWL2hvbWUva3ViYS9Db2RpbmcvZ2FtZXNxAH4AEwAAAAAAAAAAAAAAAAAAAAxzcQB+ABZ3DAAAABA/QAAAAAAAAHhzcQB+AAx0AEkvZ2FtZS9zcmMvbWFpbi9qYXZhL2N6L2p6aXRuaWsvY2xpZW50L2Fubm90YXRpb25zL1NvY2tldEV2ZW50SGFuZGxlci5qYXZhdAAXU29ja2V0RXZlbnRIYW5kbGVyLmphdmF0ABYvaG9tZS9rdWJhL0NvZGluZy9nYW1lc3EAfgATAAAAEgAAAAAAAAAKAAAAEHNxAH4AFncMAAAAID9AAAAAAAAScQB+ABpxAH4AG3EAfgAccQB+AB1xAH4AHnEAfgAfcQB+ACBxAH4AIXEAfgAicQB+ACNxAH4AJHEAfgAlcQB+ACxxAH4ALXEAfgAucQB+AC9xAH4AMHNxAH4AGAAAABF4cHBwcHBweA==" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package cz.jzitnik.common.socket.messages.game.creation;
|
||||||
|
|
||||||
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
|
|
||||||
|
public class CreateGame implements SocketMessage {
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package cz.jzitnik.common.socket.messages.game.creation;
|
||||||
|
|
||||||
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
|
|
||||||
|
public class CreateGameResponse implements SocketMessage {
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@ import org.reflections.Reflections;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class Game {
|
public class Game {
|
||||||
private final DependencyManager dependencyManager = new DependencyManager(new Reflections("cz.jzitnik"));
|
private final DependencyManager dependencyManager = new DependencyManager(new Reflections("cz.jzitnik.client"));
|
||||||
|
|
||||||
@InjectDependency
|
@InjectDependency
|
||||||
private Cli cli;
|
private Cli cli;
|
||||||
|
|||||||
@@ -5,11 +5,9 @@ import cz.jzitnik.client.annotations.Dependency;
|
|||||||
import cz.jzitnik.client.annotations.injectors.InjectDependency;
|
import cz.jzitnik.client.annotations.injectors.InjectDependency;
|
||||||
import cz.jzitnik.client.annotations.ui.KeyboardPressHandler;
|
import cz.jzitnik.client.annotations.ui.KeyboardPressHandler;
|
||||||
import cz.jzitnik.client.annotations.ui.UI;
|
import cz.jzitnik.client.annotations.ui.UI;
|
||||||
import cz.jzitnik.client.events.ExitEvent;
|
import cz.jzitnik.client.events.*;
|
||||||
import cz.jzitnik.client.events.FullRedrawEvent;
|
|
||||||
import cz.jzitnik.client.events.KeyboardPressEvent;
|
|
||||||
import cz.jzitnik.client.events.PlayerMoveEvent;
|
|
||||||
import cz.jzitnik.client.utils.events.EventManager;
|
import cz.jzitnik.client.utils.events.EventManager;
|
||||||
|
import cz.jzitnik.common.socket.messages.Test;
|
||||||
|
|
||||||
@UI
|
@UI
|
||||||
@Dependency
|
@Dependency
|
||||||
@@ -37,4 +35,11 @@ public class GlobalShortcuts {
|
|||||||
eventManager.emitEvent(new PlayerMoveEvent(event.getKeyStroke()));
|
eventManager.emitEvent(new PlayerMoveEvent(event.getKeyStroke()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@KeyboardPressHandler(character = 'p')
|
||||||
|
public boolean debugSocket(KeyboardPressEvent event) {
|
||||||
|
eventManager.emitEvent(new SendSocketMessageEvent(new Test()));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,5 +62,11 @@
|
|||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
<version>1.5.25</version>
|
<version>1.5.25</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.reflections</groupId>
|
||||||
|
<artifactId>reflections</artifactId>
|
||||||
|
<version>0.10.2</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -1,14 +1,24 @@
|
|||||||
package cz.jzitnik.server;
|
package cz.jzitnik.server;
|
||||||
|
|
||||||
|
import cz.jzitnik.server.context.AppContext;
|
||||||
|
import cz.jzitnik.server.context.GlobalContext;
|
||||||
|
import cz.jzitnik.server.events.EventManager;
|
||||||
|
import cz.jzitnik.server.socket.WebSocket;
|
||||||
import jakarta.websocket.DeploymentException;
|
import jakarta.websocket.DeploymentException;
|
||||||
import org.glassfish.tyrus.server.Server;
|
import org.glassfish.tyrus.server.Server;
|
||||||
|
import org.reflections.Reflections;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Scanner;
|
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
static void main() throws DeploymentException {
|
static void main() throws DeploymentException {
|
||||||
|
GlobalContext globalContext = new GlobalContext();
|
||||||
|
AppContext.set(globalContext);
|
||||||
|
|
||||||
|
EventManager eventManager = new EventManager(new Reflections("cz.jzitnik.server"), globalContext);
|
||||||
|
globalContext.setEventManager(eventManager);
|
||||||
|
eventManager.start();
|
||||||
|
|
||||||
Map<String, Object> properties = new HashMap<>();
|
Map<String, Object> properties = new HashMap<>();
|
||||||
Server server = new Server("localhost", 8025, "/", properties, WebSocket.class);
|
Server server = new Server("localhost", 8025, "/", properties, WebSocket.class);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package cz.jzitnik.server.annotations;
|
||||||
|
|
||||||
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
public @interface EventHandler {
|
||||||
|
Class<? extends SocketMessage> value();
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package cz.jzitnik.server.context;
|
||||||
|
|
||||||
|
public class AppContext {
|
||||||
|
private static GlobalContext globalContext;
|
||||||
|
|
||||||
|
public static void set(GlobalContext context) {
|
||||||
|
globalContext = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GlobalContext get() {
|
||||||
|
return globalContext;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package cz.jzitnik.server.context;
|
||||||
|
|
||||||
|
public class GameManager {
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package cz.jzitnik.server.context;
|
||||||
|
|
||||||
|
import cz.jzitnik.server.game.Client;
|
||||||
|
import cz.jzitnik.server.events.EventManager;
|
||||||
|
import cz.jzitnik.server.socket.SocketSession;
|
||||||
|
import jakarta.websocket.Session;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class GlobalContext {
|
||||||
|
@Getter
|
||||||
|
private final HashMap<Session, Client> sessions = new HashMap<>();
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private EventManager eventManager;
|
||||||
|
|
||||||
|
public void registerClient(Session session) {
|
||||||
|
Client client = new Client(new SocketSession(session));
|
||||||
|
sessions.put(session, client);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package cz.jzitnik.server.events;
|
||||||
|
|
||||||
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
|
import cz.jzitnik.server.game.Client;
|
||||||
|
|
||||||
|
public abstract class AbstractEventHandler<T extends SocketMessage> {
|
||||||
|
public abstract void handle(T event, Client client);
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package cz.jzitnik.server.events;
|
||||||
|
|
||||||
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
|
import cz.jzitnik.server.game.Client;
|
||||||
|
import cz.jzitnik.server.annotations.EventHandler;
|
||||||
|
import cz.jzitnik.server.context.GlobalContext;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.reflections.Reflections;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.BlockingQueue;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class EventManager extends Thread {
|
||||||
|
private ExecutorService eventExecutor;
|
||||||
|
private final HashMap<Class<? extends SocketMessage>, AbstractEventHandler<?>> handlers = new HashMap<>();
|
||||||
|
private final BlockingQueue<Registry> eventQueue = new LinkedBlockingQueue<>();
|
||||||
|
|
||||||
|
private record Registry(SocketMessage event, Client client) {}
|
||||||
|
|
||||||
|
public void emitEvent(SocketMessage event, Client client) {
|
||||||
|
eventQueue.add(new Registry(event, client));
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventManager(Reflections reflections, GlobalContext globalContext) {
|
||||||
|
setDaemon(true);
|
||||||
|
|
||||||
|
var classes = reflections.getTypesAnnotatedWith(EventHandler.class);
|
||||||
|
|
||||||
|
for (var clazz : classes) {
|
||||||
|
EventHandler eventHandler = clazz.getAnnotation(EventHandler.class);
|
||||||
|
try {
|
||||||
|
var instance = (AbstractEventHandler<?>) clazz.getDeclaredConstructor(GlobalContext.class).newInstance(globalContext);
|
||||||
|
handlers.put(eventHandler.value(), instance);
|
||||||
|
} catch (InstantiationException | IllegalAccessException | InvocationTargetException |
|
||||||
|
NoSuchMethodException e) {
|
||||||
|
log.error("Failed to instantiate socket event handler: {}", clazz.getName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
eventExecutor = Executors.newFixedThreadPool(6);
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
Registry registry = eventQueue.take();
|
||||||
|
handleEvent(registry.event, registry.client);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
eventExecutor.shutdownNow();
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//eventExecutor.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private <T extends SocketMessage> AbstractEventHandler<T> getHandler(Class<T> type) {
|
||||||
|
return (AbstractEventHandler<T>) handlers.get(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private void handleEvent(SocketMessage event, Client client) {
|
||||||
|
eventExecutor.submit(() -> {
|
||||||
|
try {
|
||||||
|
AbstractEventHandler<SocketMessage> handler = getHandler((Class<SocketMessage>) event.getClass());
|
||||||
|
handler.handle(event, client);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package cz.jzitnik.server.events.handlers;
|
||||||
|
|
||||||
|
import cz.jzitnik.common.socket.messages.game.creation.CreateGame;
|
||||||
|
import cz.jzitnik.server.annotations.EventHandler;
|
||||||
|
import cz.jzitnik.server.events.AbstractEventHandler;
|
||||||
|
import cz.jzitnik.server.game.Client;
|
||||||
|
|
||||||
|
@EventHandler(CreateGame.class)
|
||||||
|
public class CreateGameHandler extends AbstractEventHandler<CreateGame> {
|
||||||
|
@Override
|
||||||
|
public void handle(CreateGame event, Client client) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
5
server/src/main/java/cz/jzitnik/server/game/Client.java
Normal file
5
server/src/main/java/cz/jzitnik/server/game/Client.java
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package cz.jzitnik.server.game;
|
||||||
|
|
||||||
|
import cz.jzitnik.server.socket.SocketSession;
|
||||||
|
|
||||||
|
public record Client(SocketSession session) {}
|
||||||
4
server/src/main/java/cz/jzitnik/server/game/Game.java
Normal file
4
server/src/main/java/cz/jzitnik/server/game/Game.java
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
package cz.jzitnik.server.game;
|
||||||
|
|
||||||
|
public class Game {
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package cz.jzitnik.server.socket;
|
||||||
|
|
||||||
|
import cz.jzitnik.server.context.AppContext;
|
||||||
|
import jakarta.websocket.HandshakeResponse;
|
||||||
|
import jakarta.websocket.server.HandshakeRequest;
|
||||||
|
import jakarta.websocket.server.ServerEndpointConfig;
|
||||||
|
|
||||||
|
public class GlobalContextConfigurator extends ServerEndpointConfig.Configurator {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
|
||||||
|
sec.getUserProperties().put("globalContext", AppContext.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package cz.jzitnik.server.socket;
|
||||||
|
|
||||||
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
|
import cz.jzitnik.common.socket.messages.Test;
|
||||||
|
import jakarta.websocket.Session;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public class SocketSession {
|
||||||
|
private final Session session;
|
||||||
|
|
||||||
|
public void sendMessage(SocketMessage message) {
|
||||||
|
try {
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||||
|
oos.writeObject(message);
|
||||||
|
oos.flush();
|
||||||
|
session.getBasicRemote().sendBinary(java.nio.ByteBuffer.wrap(baos.toByteArray()));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
package cz.jzitnik.server;
|
package cz.jzitnik.server.socket;
|
||||||
|
|
||||||
import cz.jzitnik.common.socket.SocketMessage;
|
import cz.jzitnik.common.socket.SocketMessage;
|
||||||
import cz.jzitnik.common.socket.messages.Test;
|
import cz.jzitnik.server.game.Client;
|
||||||
|
import cz.jzitnik.server.context.GlobalContext;
|
||||||
import jakarta.websocket.*;
|
import jakarta.websocket.*;
|
||||||
import jakarta.websocket.server.ServerEndpoint;
|
import jakarta.websocket.server.ServerEndpoint;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -9,33 +10,25 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ServerEndpoint("/ws")
|
@ServerEndpoint(value = "/ws", configurator = GlobalContextConfigurator.class)
|
||||||
public class WebSocket {
|
public class WebSocket {
|
||||||
|
|
||||||
@OnOpen
|
private GlobalContext globalContext;
|
||||||
public void onOpen(Session session) {
|
|
||||||
log.debug("Client connected: " + session.getId());
|
|
||||||
|
|
||||||
try {
|
@OnOpen
|
||||||
SocketMessage response = new Test();
|
public void onOpen(Session session, EndpointConfig config) {
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
this.globalContext = (GlobalContext) config.getUserProperties().get("globalContext");
|
||||||
ObjectOutputStream oos = new ObjectOutputStream(baos);
|
globalContext.registerClient(session);
|
||||||
oos.writeObject(response);
|
log.debug("Client connected: {}", session.getId());
|
||||||
oos.flush();
|
|
||||||
session.getBasicRemote().sendBinary(java.nio.ByteBuffer.wrap(baos.toByteArray()));
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Receive binary data from client
|
|
||||||
@OnMessage
|
@OnMessage
|
||||||
public void onMessage(byte[] bytes, Session session) {
|
public void onMessage(byte[] bytes, Session session) {
|
||||||
try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
|
try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
|
||||||
ObjectInputStream ois = new ObjectInputStream(bais)) {
|
ObjectInputStream ois = new ObjectInputStream(bais)) {
|
||||||
|
|
||||||
SocketMessage socketMessage = (SocketMessage) ois.readObject();
|
SocketMessage socketMessage = (SocketMessage) ois.readObject();
|
||||||
System.out.println("Received: " + socketMessage);
|
Client client = globalContext.getSessions().get(session);
|
||||||
|
globalContext.getEventManager().emitEvent(socketMessage, client);
|
||||||
} catch (IOException | ClassNotFoundException e) {
|
} catch (IOException | ClassNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user