Merge remote-tracking branch 'origin/main' into feat/game-ui

This commit is contained in:
Julian Kropff
2026-03-14 17:00:28 +01:00
10 changed files with 45 additions and 75 deletions
@@ -4,18 +4,21 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.NetworkManager;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* Application class for starting the server.
*/
/** Application class for starting the server. */
public class ServerApp {
public static void start(String arg) {
int port = Integer.parseInt(arg);
System.out.println("You've selected the server. It will accept connections at port " + port);
Logger logger = LogManager.getLogger(ServerApp.class);
logger.info("Starting server at port {}", port);
EventBus eventBus = new EventBus();
SessionManager sessionManager = new SessionManager();
eventBus.subscribe(DisconnectEvent.class, event -> sessionManager.removeSession(event.sessionId()));
eventBus.subscribe(
DisconnectEvent.class, event -> sessionManager.removeSession(event.sessionId()));
NetworkManager networkManager = new NetworkManager(port, sessionManager, eventBus);
networkManager.start();
}
@@ -1,21 +1,17 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.Session;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TcpTransport;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* Creates and manages the server socket. Accepts new incoming connections and creates sessions.
*/
/** Creates and manages the server socket. Accepts new incoming connections and creates sessions. */
public class NetworkManager implements Runnable {
private Integer port;
private Logger logger;
@@ -41,11 +37,9 @@ public class NetworkManager implements Runnable {
this.eventBus.subscribe(DisconnectEvent.class, event -> clientDisconnected(event));
}
/**
* Starts the internal thread to accept new connections.
*/
/** Starts the internal thread to accept new connections. */
public void start() {
logger.debug("Starting server at port " + port);
logger.debug("Starting at port {}", port);
thread.start();
}
@@ -55,19 +49,17 @@ public class NetworkManager implements Runnable {
* @param event the disconnect event
*/
public void clientDisconnected(DisconnectEvent event) {
logger.info("Session " + event.sessionId().value() + " disconnected adhasghd");
logger.info("Session {} disconnected", event.sessionId().value());
}
/**
* Runs the network manager loop, accepting connections.
*/
/** Runs the network manager loop, accepting connections. */
@Override
public void run() {
try (ServerSocket serverSocket = new ServerSocket(port)) {
while (running) {
Socket clientSocket = serverSocket.accept();
System.out.println("Accepted connection from " + clientSocket.getRemoteSocketAddress());
logger.debug("Accepted connection from {}", clientSocket.getRemoteSocketAddress());
Session session = new Session(new TcpTransport(clientSocket), eventBus);
sessionManager.addSession(session);
@@ -2,7 +2,5 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.events;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
/**
* Represents a disconnect event for a session.
*/
/** Represents a disconnect event for a session. */
public record DisconnectEvent(SessionId sessionId) implements Event {}
@@ -1,6 +1,4 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.events;
/**
* Marker interface for events in the event bus system.
*/
/** Marker interface for events in the event bus system. */
interface Event {}
@@ -7,9 +7,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
/**
* A simple event bus for publishing and subscribing to events.
*/
/** A simple event bus for publishing and subscribing to events. */
public class EventBus {
private final Map<Class<?>, List<Consumer<Object>>> handlers = new ConcurrentHashMap<>();
@@ -19,7 +17,9 @@ public class EventBus {
* @param eventType the class of the event to subscribe to
* @param handler the consumer to handle the event
*/
@SuppressWarnings("unchecked") // This cast is safe, because handlers only get passed the type they subscribed to
@SuppressWarnings(
"unchecked") // This cast is safe, because handlers only get passed the type they
// subscribed to
public <T extends Event> void subscribe(Class<T> eventType, Consumer<T> handler) {
handlers.computeIfAbsent(eventType, k -> new CopyOnWriteArrayList<>())
.add((Consumer<Object>) (Consumer<?>) handler);
@@ -1,17 +1,14 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
import java.io.EOFException;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
/**
* Represents a client session in the network server.
*/
/** Represents a client session in the network server. */
public class Session implements Runnable {
private SessionId id;
private Thread thread;
@@ -47,9 +44,7 @@ public class Session implements Runnable {
return this.id;
}
/**
* Starts the session thread.
*/
/** Starts the session thread. */
public void start() {
thread.start();
}
@@ -64,14 +59,12 @@ public class Session implements Runnable {
this.running = false;
}
/**
* Runs the session loop, reading from the transport.
*/
/** Runs the session loop, reading from the transport. */
@Override
public void run() {
while (running) {
try {
System.out.println("Recieved: " + transport.read());
logger.debug("Recieved: {}", transport.read());
} catch (EOFException e) {
logger.info("Client disconnected");
eventBus.publish(new DisconnectEvent(id));
@@ -2,15 +2,11 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
import java.util.UUID;
/**
* Represents a unique identifier for a session.
*/
/** Represents a unique identifier for a session. */
public class SessionId {
private final UUID value;
/**
* Creates a new SessionId with a randomly generated UUID.
*/
/** Creates a new SessionId with a randomly generated UUID. */
public SessionId() {
this.value = UUID.randomUUID();
}
@@ -3,15 +3,11 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Manages active sessions in the server.
*/
/** Manages active sessions in the server. */
public class SessionManager {
private Map<SessionId, Session> sessions;
/**
* Constructs a new SessionManager.
*/
/** Constructs a new SessionManager. */
public SessionManager() {
this.sessions = new ConcurrentHashMap<>();
}
@@ -23,7 +19,6 @@ public class SessionManager {
*/
public void addSession(Session session) {
sessions.put(session.getId(), session);
System.out.println("Added session " + session.getId().value() + " to session manager");
}
/**
@@ -33,7 +28,6 @@ public class SessionManager {
* @return the removed session, or null if not found
*/
public Session removeSession(SessionId id) {
System.out.println("Removed session " + id.value() + " from session manager");
return sessions.remove(id);
}
@@ -6,9 +6,7 @@ import java.io.IOException;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/**
* Implements TCP-based transport layer for network communication.
*/
/** Implements TCP-based transport layer for network communication. */
public class TcpTransport implements TransportLayer {
private Socket socket;
private DataInputStream in;
@@ -2,9 +2,7 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.transport;
import java.io.IOException;
/**
* Interface for transport layer implementations.
*/
/** Interface for transport layer implementations. */
public interface TransportLayer {
/**
* Reads data from the transport layer.