From 2fe430900d49abb73c9f47601d56f513d1aeef21 Mon Sep 17 00:00:00 2001 From: AleandroPagani Date: Fri, 24 Apr 2026 16:56:53 +0200 Subject: [PATCH 1/5] Add: ClientLauncher Fix: changed management of addPlayer in ServerLauncher --- .../it/polimi/ingsw/gc14/ClientLauncher.java | 28 +++++++++++++ .../it/polimi/ingsw/gc14/ServerLauncher.java | 40 ++++++++++++++----- 2 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 src/main/java/it/polimi/ingsw/gc14/ClientLauncher.java diff --git a/src/main/java/it/polimi/ingsw/gc14/ClientLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ClientLauncher.java new file mode 100644 index 0000000..fd8a3f8 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/ClientLauncher.java @@ -0,0 +1,28 @@ +package it.polimi.ingsw.gc14; +import java.util.Scanner; + +public class ClientLauncher { + public void main() { + Scanner scanner = new Scanner(System.in); + + System.out.println("Selezionare nome utente: "); + String username = scanner.next(); + System.out.println(username); + + System.out.println("Selezionare numero di giocatori desiderato: "); + int proposedNumPlayers = scanner.nextInt(); + System.out.println(proposedNumPlayers); + + System.out.println("Selezionare RMI[0] o TCP[1]: "); + int networkType = scanner.nextInt(); + System.out.println(networkType); + + scanner.close(); // chiudi solo alla fine + + if (networkType == 0) { + return; + } else if (networkType == 1) { + return; + } + } +} \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index b3c14d7..36b57bc 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -4,6 +4,7 @@ package it.polimi.ingsw.gc14; import it.polimi.ingsw.gc14.Controller.GameController; import it.polimi.ingsw.gc14.Model.Game; import it.polimi.ingsw.gc14.Network.NetworkEvent; +import it.polimi.ingsw.gc14.Network.NetworkEvents.AddPlayer; import it.polimi.ingsw.gc14.Network.RMI.Server.RMIServer; import it.polimi.ingsw.gc14.Network.TCP.Server.TCPServer; @@ -26,7 +27,7 @@ public class ServerLauncher { this.serverTCP = serverTCP; } - public boolean doFirstEvent() throws InterruptedException, RemoteException { + public boolean doFirstEven() throws InterruptedException, RemoteException { NetworkEvent event = actionQueue.take(); if(event.apply(gameController)) { serverRMI.notifyAll(event); @@ -40,24 +41,45 @@ public class ServerLauncher { } - public static void main() throws RemoteException { + public static void main() throws RemoteException, InterruptedException { + // 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 + BlockingQueue actionQueue = new LinkedBlockingQueue<>(); - Game model = new Game(); - GameController gameController = new GameController(model); + GameController gameController = new GameController(); RMIServer serverRMI = new RMIServer(gameController, 1099, actionQueue); TCPServer serverTCP = new TCPServer(gameController, 8080, actionQueue); - serverRMI.start(); - new Thread (()->{serverTCP.start();}).start(); - ServerLauncher launcher = new ServerLauncher(actionQueue, gameController, serverRMI, serverTCP); launcher.run(); } - public void run() { + public void run() throws InterruptedException, RemoteException { + + // Aggiunge il primo player e imposta il numero di giocatori voluti + AddPlayer player1 = (AddPlayer) actionQueue.take(); + Game model = new Game(player1.getProposedNPlayer()); + gameController.setModel(model); + player1.apply(gameController); + + for(int i=1; i Date: Fri, 24 Apr 2026 18:19:15 +0200 Subject: [PATCH 2/5] Add: LimitedList --- .../it/polimi/ingsw/gc14/LimitedList.java | 26 +++++++++++++++++++ .../it/polimi/ingsw/gc14/ServerLauncher.java | 26 ++++++++----------- 2 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 src/main/java/it/polimi/ingsw/gc14/LimitedList.java diff --git a/src/main/java/it/polimi/ingsw/gc14/LimitedList.java b/src/main/java/it/polimi/ingsw/gc14/LimitedList.java new file mode 100644 index 0000000..fb582c3 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/LimitedList.java @@ -0,0 +1,26 @@ +package it.polimi.ingsw.gc14; + +import java.util.ArrayList; + +public class LimitedList extends ArrayList { + private int limit; + private final Runnable action; + + public LimitedList(int limit, Runnable action) { + this.limit = limit; + this.action = action; + } + + @Override + public boolean add(Player element) { + boolean result = super.add(element); + if (size() >= limit) { + action.run(); + } + return result; + } + + public void setElement(int num) { + this.limit=num; + } +} \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index 36b57bc..2761ab8 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -17,6 +17,7 @@ public class ServerLauncher { GameController gameController; RMIServer serverRMI; TCPServer serverTCP; + LimitedList players; @@ -25,6 +26,16 @@ public class ServerLauncher { this.serverRMI = serverRMI; this.gameController = gameController; this.serverTCP = serverTCP; + this.players = new LimitedList<>(5, ()->{ + synchronized (gameController) { + try { + serverRMI.notifyAll(gameController.getModel()); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + }); } public boolean doFirstEven() throws InterruptedException, RemoteException { @@ -59,21 +70,6 @@ public class ServerLauncher { public void run() throws InterruptedException, RemoteException { // Aggiunge il primo player e imposta il numero di giocatori voluti - AddPlayer player1 = (AddPlayer) actionQueue.take(); - Game model = new Game(player1.getProposedNPlayer()); - gameController.setModel(model); - player1.apply(gameController); - - for(int i=1; i Date: Fri, 24 Apr 2026 18:28:52 +0200 Subject: [PATCH 3/5] Add: LimitedList --- .../java/it/polimi/ingsw/gc14/LimitedList.java | 6 ++++-- .../it/polimi/ingsw/gc14/ServerLauncher.java | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/LimitedList.java b/src/main/java/it/polimi/ingsw/gc14/LimitedList.java index fb582c3..0bb1d66 100644 --- a/src/main/java/it/polimi/ingsw/gc14/LimitedList.java +++ b/src/main/java/it/polimi/ingsw/gc14/LimitedList.java @@ -2,7 +2,7 @@ package it.polimi.ingsw.gc14; import java.util.ArrayList; -public class LimitedList extends ArrayList { +public class LimitedList extends ArrayList { private int limit; private final Runnable action; @@ -12,7 +12,7 @@ public class LimitedList extends ArrayList { } @Override - public boolean add(Player element) { + public boolean add(String element) { boolean result = super.add(element); if (size() >= limit) { action.run(); @@ -23,4 +23,6 @@ public class LimitedList extends ArrayList { public void setElement(int num) { this.limit=num; } + + public int getLimit(){return limit;} } \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index 2761ab8..6db75a5 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -27,14 +27,13 @@ public class ServerLauncher { this.gameController = gameController; this.serverTCP = serverTCP; this.players = new LimitedList<>(5, ()->{ - synchronized (gameController) { - try { - serverRMI.notifyAll(gameController.getModel()); - } catch (RemoteException e) { - throw new RuntimeException(e); - } + try { + run(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } catch (RemoteException e) { + throw new RuntimeException(e); } - }); } @@ -70,7 +69,10 @@ public class ServerLauncher { public void run() throws InterruptedException, RemoteException { // Aggiunge il primo player e imposta il numero di giocatori voluti - + Game model = new Game(players.getLimit()); + gameController.setModel(model); + serverRMI.notifyAll(model); + //serverTCP.broadcastUpdate(model); while (true) { From 783380218776c8dfea09a369b8887ea1a18e9d67 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Fri, 24 Apr 2026 18:31:04 +0200 Subject: [PATCH 4/5] Fixed: RMIServer and RMIClient --- .../gc14/Network/RMI/Client/RMIClient.java | 4 +-- .../gc14/Network/RMI/Common/IGameServer.java | 2 +- .../gc14/Network/RMI/Server/RMIServer.java | 29 ++++++++++++++----- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java index ac0e14b..8d0721c 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java @@ -18,7 +18,7 @@ public class RMIClient { } - public boolean connect(String username,ClientController clientController) { + public boolean connect(String username,int preferredInt,ClientController clientController) { // 1. Connettiti al registry try { Registry registry = LocateRegistry.getRegistry(host, port); @@ -29,7 +29,7 @@ public class RMIClient { // 3. Crea il callback e registralo ClientCallbackImpl callback = new ClientCallbackImpl(clientController); - if (!stub.joinGame(username, callback)) + if (!stub.joinGame(username,preferredInt, callback)) { stub = null; return false; diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IGameServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IGameServer.java index 8bcaff6..7a1ef25 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IGameServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IGameServer.java @@ -6,7 +6,7 @@ import java.rmi.*; public interface IGameServer extends Remote { - boolean joinGame(String username, IClientCallback callback) throws RemoteException; + boolean joinGame(String username,int preferredInt, IClientCallback callback) throws RemoteException; boolean doEvent(NetworkEvent event) throws RemoteException; } 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 d81eb96..9e3d0e8 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 @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.RMI.Server; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.LimitedList; import it.polimi.ingsw.gc14.Model.Game; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.RMI.Common.IClientCallback; @@ -24,31 +25,43 @@ public class RMIServer implements IGameServer { private int nPort; private final Map clients = new ConcurrentHashMap<>(); BlockingQueue actionQueue; - + private LimitedList playerList; // Costruttore - public RMIServer(GameController controller, int nPort, BlockingQueue actionQueue) throws RemoteException { + public RMIServer(GameController controller, int nPort, BlockingQueue actionQueue,LimitedList playerList) throws RemoteException { this.controller = controller; this.nPort = nPort; this.actionQueue = actionQueue; + this.playerList = playerList; } + // Metodi esposti RMI public void setController (GameController controller) { this.controller = controller; } @Override - public boolean joinGame(String username, IClientCallback callback) { - if(controller.addPlayer(username)) - { - clients.put(username, callback); - return true; + public boolean joinGame(String username, int preferredInt,IClientCallback callback) { + synchronized (controller) { + if(playerList.size()==0 && (preferredInt<2||preferredInt>5)) + return false; + if (controller.addPlayer(username)) { + if(playerList.size()==0) + { + Game game= new Game(preferredInt); + controller.setModel(game); + playerList.setElement(preferredInt); + } + playerList.add(username); + clients.put(username, callback); + return true; + } + return false; } - return false; } @Override public boolean doEvent(NetworkEvent event) throws RemoteException { From b88b57e9d9bc068c98390878d8af3f0e0d3be810 Mon Sep 17 00:00:00 2001 From: AleandroPagani Date: Fri, 24 Apr 2026 18:36:50 +0200 Subject: [PATCH 5/5] Fix: boh --- src/main/java/it/polimi/ingsw/gc14/LimitedList.java | 6 +++--- .../ingsw/gc14/Network/RMI/Server/RMIServer.java | 2 +- .../java/it/polimi/ingsw/gc14/ServerLauncher.java | 11 ++++------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/LimitedList.java b/src/main/java/it/polimi/ingsw/gc14/LimitedList.java index 0bb1d66..7ef8a47 100644 --- a/src/main/java/it/polimi/ingsw/gc14/LimitedList.java +++ b/src/main/java/it/polimi/ingsw/gc14/LimitedList.java @@ -2,7 +2,7 @@ package it.polimi.ingsw.gc14; import java.util.ArrayList; -public class LimitedList extends ArrayList { +public class LimitedList extends ArrayList { private int limit; private final Runnable action; @@ -12,7 +12,7 @@ public class LimitedList extends ArrayList { } @Override - public boolean add(String element) { + public boolean add(T element) { boolean result = super.add(element); if (size() >= limit) { action.run(); @@ -20,7 +20,7 @@ public class LimitedList extends ArrayList { return result; } - public void setElement(int num) { + public void setLimit(int num) { this.limit=num; } 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 9e3d0e8..fc74f3c 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 @@ -54,7 +54,7 @@ public class RMIServer implements IGameServer { { Game game= new Game(preferredInt); controller.setModel(game); - playerList.setElement(preferredInt); + playerList.setLimit(preferredInt); } playerList.add(username); clients.put(username, callback); diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index 6db75a5..5197c13 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -17,7 +17,7 @@ public class ServerLauncher { GameController gameController; RMIServer serverRMI; TCPServer serverTCP; - LimitedList players; + static LimitedList players; @@ -59,8 +59,8 @@ public class ServerLauncher { BlockingQueue actionQueue = new LinkedBlockingQueue<>(); GameController gameController = new GameController(); - RMIServer serverRMI = new RMIServer(gameController, 1099, actionQueue); - TCPServer serverTCP = new TCPServer(gameController, 8080, actionQueue); + RMIServer serverRMI = new RMIServer(gameController, 1099, actionQueue, players); + TCPServer serverTCP = new TCPServer(gameController, 8080, actionQueue, players); ServerLauncher launcher = new ServerLauncher(actionQueue, gameController, serverRMI, serverTCP); launcher.run(); @@ -68,10 +68,7 @@ public class ServerLauncher { public void run() throws InterruptedException, RemoteException { - // Aggiunge il primo player e imposta il numero di giocatori voluti - Game model = new Game(players.getLimit()); - gameController.setModel(model); - serverRMI.notifyAll(model); + serverRMI.notifyAll(gameController.getModel()); //serverTCP.broadcastUpdate(model);