From e2b51fd914af48c5f22d3665298a684095a71382 Mon Sep 17 00:00:00 2001 From: AleandroPagani Date: Fri, 24 Apr 2026 11:30:43 +0200 Subject: [PATCH] Add: first implementation of ServerLauncher --- .../gc14/Network/RMI/Server/RMIServer.java | 6 +- .../gc14/Network/TCP/Server/TCPServer.java | 2 +- .../it/polimi/ingsw/gc14/ServerLauncher.java | 66 ++++++++++++++++++- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java index 9a82dec..0c4fd8d 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java @@ -63,17 +63,17 @@ public class RMIServer implements IGameServer { // Metodi interni del server - private void notifyAll(NetworkEvent action) throws RemoteException { + public void notifyAll(NetworkEvent action) throws RemoteException { for (IClientCallback cb : clients.values()) { cb.onAction(action); } } - private void notifyAll(Game model) throws RemoteException { + public void notifyAll(Game model) throws RemoteException { for (IClientCallback cb : clients.values()) { cb.onGameInit(model); } } - private void notifyError(String username, String message) throws RemoteException { + public void notifyError(String username, String message) throws RemoteException { IClientCallback cb = clients.get(username); if (cb != null) cb.onError(message); } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java index da62d1d..970d032 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java @@ -80,7 +80,7 @@ public class TCPServer { } } - private TCPServer(GameController gameController, int port){ + public TCPServer(GameController gameController, int port){ this.port = port; this.gameController = gameController; } diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index a1bd487..14d4c4d 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -1,11 +1,75 @@ package it.polimi.ingsw.gc14; +import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Network.NetworkEvent; +import it.polimi.ingsw.gc14.Network.RMI.Server.RMIServer; +import it.polimi.ingsw.gc14.Network.TCP.Server.TCPServer; + +import java.rmi.RemoteException; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + public class ServerLauncher { - public static void main(String[] args){ + BlockingQueue actionQueue; + GameController gameController; + RMIServer serverRMI; + TCPServer serverTCP; + + + + public ServerLauncher(GameController gameController, RMIServer serverRMI, TCPServer serverTCP) { + this.actionQueue = new LinkedBlockingQueue<>(); + this.serverRMI = serverRMI; + this.gameController = gameController; + this.serverTCP = serverTCP; + } + + public boolean doFirstEven() throws InterruptedException, RemoteException { + if(!actionQueue.isEmpty()) { + NetworkEvent event = actionQueue.take(); + if(event.apply(gameController)) { + serverRMI.notifyAll(event); + serverTCP.broadcastUpdate(event); + return true; + } else { + //serverRMI.notifyError(); // TODO difficile trovare username. Converrebbe mettere in network event un booleano che dice se รจ stato accettato e fare una notifyAll anche per errori + //serverTCP // TODO non esiste un notify error + return false; + } + } + return false; + } + + public boolean addEvent(NetworkEvent event) { + return actionQueue.offer(event); + } + + + public static void main(String[] args) throws RemoteException { // TODO // Deve avere una coda con gli eventi. // Il server RMI e il server TCP quando ricevono un doEvent devono aggiungere l'evento alla coda condivisa // Questa classe esegue gli eventi nella coda e chiama il notify all e notify error sia RMI che TCP + + GameController gameController = new GameController(); + RMIServer serverRMI = new RMIServer(gameController, 1099); + TCPServer serverTCP = new TCPServer(gameController, 8080); + + ServerLauncher launcher = new ServerLauncher(gameController, serverRMI, serverTCP); + launcher.run(); + } + + public void run() { + while (true) { + try { + this.doFirstEven(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } } }