From bbeec46ca26bd0a17db51a505946c02e2c89ce62 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Tue, 26 May 2026 17:49:47 +0200 Subject: [PATCH] Fixed: new game after server crash --- .../gc14/Network/RMI/Server/RMIServer.java | 56 +++----- .../gc14/Network/TCP/Server/TCPServer.java | 120 +++++++----------- .../it/polimi/ingsw/gc14/ServerLauncher.java | 31 ++--- 3 files changed, 76 insertions(+), 131 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 ee0d09c..9cc59fd 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 @@ -47,16 +47,6 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { BlockingQueue actionQueue; private LimitedMap playerList; - private boolean serverCrashed; - - /** - * Sets whether the server is recovering from a previous crash. - * - * @param serverCrashed {@code true} if the server is in crash-recovery mode, - */ - public void setServerCrashed(boolean serverCrashed) { - this.serverCrashed = serverCrashed; - } /** * Constructs an RMI server with the required game and network components. @@ -96,30 +86,25 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { if (preferredInt < 2 || preferredInt > 5) return false; synchronized (controller) { - if(serverCrashed) - { - if(controller.getModel().getPlayers().stream().anyMatch(p -> p.getUserName().equals(username))&& !playerList.containsKey(username)) { - clients.put(username, callback); - playerList.put(username, true); - startWatchdog(username); - System.out.println("(After crash)Reconnected player: " + username); - return true; - } + + if (playerList.isEmpty() && controller.getModel()==null) { + controller.setModel(new Game(preferredInt)); + playerList.setLimit(preferredInt); + System.out.println("Game Created With :"+preferredInt+" Players"); } - else - { - if (playerList.isEmpty()) { - controller.setModel(new Game(preferredInt)); - playerList.setLimit(preferredInt); - System.out.println("Game Created With :"+preferredInt+" Players"); - } - if (controller.addPlayer(username)) { - clients.put(username, callback); - playerList.put(username, true); - startWatchdog(username); - System.out.println("Accepted player: " + username); - return true; - } + if (controller.addPlayer(username)) { + clients.put(username, callback); + playerList.put(username, true); + startWatchdog(username); + System.out.println("Accepted player: " + username); + return true; + } + if(controller.getModel().getPlayers().stream().anyMatch(p -> p.getUserName().equals(username))&& !playerList.containsKey(username)) { + clients.put(username, callback); + playerList.put(username, true); + startWatchdog(username); + System.out.println("(After crash)Reconnected player: " + username); + return true; } if (playerList.containsKey(username) && !playerList.get(username)) { playerList.put(username, true); @@ -279,13 +264,10 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { * on the specified port, and registers this server instance under the * {@code RMIGameServer} name. * - * @param serverCrashed {@code true} if the server is being restarted after a crash, - * {@code false} otherwise. * @return {@code true} if the server starts successfully, * {@code false} otherwise. */ - public boolean start(boolean serverCrashed) { - this.serverCrashed = serverCrashed; + public boolean start() { try { System.setProperty("java.rmi.server.hostname", host); registry = LocateRegistry.createRegistry(nPort); 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 18551a3..2af3f18 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 @@ -73,20 +73,6 @@ public class TCPServer { */ List clientHandlers; - /** - * Flag indicating whether the server is recovering from a previous crash. - */ - boolean serverCrashed; - - /** - * Sets whether the server is recovering from a previous crash. - * - * @param serverCrashed {@code true} if the server is in crash-recovery mode, - * {@code false} otherwise. - */ - public void setServerCrashed(boolean serverCrashed) { - this.serverCrashed = serverCrashed; - } /** * Temporary map associating each username with the corresponding @@ -129,12 +115,8 @@ public class TCPServer { * the connection is handled either as a new player joining the game * or as a reconnection attempt. * - * @param serverCrashed {@code true} if the server is being restarted after a crash, - * {@code false} otherwise. */ - public void start(boolean serverCrashed) { - this.serverCrashed = serverCrashed; - + public void start() { try { socketTCP = new ServerSocket(port); heartbeatSocketTCP = new ServerSocket(heartbeatPort); @@ -180,70 +162,64 @@ public class TCPServer { synchronized (controller) { String username = eventAddPlayer.getUsername(); //reconnect players after a server crash - if (serverCrashed) { - if (controller.getModel().getPlayers().stream() - .anyMatch(p -> p.getUserName().equals(username)) - && !playerList.containsKey(username)) { - playerList.put(username, true); - System.out.println("(After crash)Reconnected player: " + username); + if (playerList.isEmpty()&& controller.getModel()==null) { + Game model = new Game(eventAddPlayer.getProposedNPlayer()); + controller.setModel(model); + playerList.setLimit(eventAddPlayer.getProposedNPlayer()); + System.out.println("Game Created With :"+eventAddPlayer.getProposedNPlayer()+" Players"); + } - ClientHandler handler = new ClientHandler( - username, - clientSocket, - clientSend, - clientReceive, - clientHandlers, - playerList, - actionQueue - ); + if (controller.addPlayer(username)) { + playerList.put(username, true); + System.out.println("Accepted player: " + username); - clientSocket.getOutputStream().write(1); - pendingHeartbeat.put(username, handler); + ClientHandler handler = new ClientHandler( + username, + clientSocket, + clientSend, + clientReceive, + clientHandlers, + playerList, + actionQueue + ); - Thread thread = new Thread(handler); - thread.start(); + clientSocket.getOutputStream().write(1); + pendingHeartbeat.put(username, handler); - clientHandlers.add(handler); - connectedPlayers++; - continue; + Thread thread = new Thread(handler); + thread.start(); - } + clientHandlers.add(handler); + connectedPlayers++; + continue; } - //manages a new player adding - else { - if (playerList.isEmpty()) { - Game model = new Game(eventAddPlayer.getProposedNPlayer()); - controller.setModel(model); - playerList.setLimit(eventAddPlayer.getProposedNPlayer()); - System.out.println("Game Created With :"+eventAddPlayer.getProposedNPlayer()+" Players"); - } + if (controller.getModel().getPlayers().stream() + .anyMatch(p -> p.getUserName().equals(username)) + && !playerList.containsKey(username)) { + playerList.put(username, true); + System.out.println("(After crash)Reconnected player: " + username); - if (controller.addPlayer(username)) { - playerList.put(username, true); - System.out.println("Accepted player: " + username); + ClientHandler handler = new ClientHandler( + username, + clientSocket, + clientSend, + clientReceive, + clientHandlers, + playerList, + actionQueue + ); - ClientHandler handler = new ClientHandler( - username, - clientSocket, - clientSend, - clientReceive, - clientHandlers, - playerList, - actionQueue - ); + clientSocket.getOutputStream().write(1); + pendingHeartbeat.put(username, handler); - clientSocket.getOutputStream().write(1); - pendingHeartbeat.put(username, handler); + Thread thread = new Thread(handler); + thread.start(); - Thread thread = new Thread(handler); - thread.start(); + clientHandlers.add(handler); + connectedPlayers++; + continue; - clientHandlers.add(handler); - connectedPlayers++; - continue; - - } } //reconnect a previously disconnected player if (playerList.containsKey(username) @@ -288,8 +264,6 @@ public class TCPServer { System.out.println("Player could not be added. Connection terminated."); } } - - } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index ff29627..30ce506 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -186,8 +186,6 @@ public class ServerLauncher { if(!entry.getValue()) playerList.remove(entry.getKey()); } - serverRMI.setServerCrashed(false); - serverTCP.setServerCrashed(false); } //notify the event else { @@ -206,13 +204,15 @@ public class ServerLauncher { // removes disconneted players when the game is ended if(event.getEventType().equals(EventType.DISCONNECTED_PLAYER)) { - playerList.remove(event.getUsername()); - if(playerList.isEmpty()) - { - gameController.setModel(null); - System.out.println("\n!!! Player list is now empty, ready for a new game init !!!\n"); + synchronized (gameController) { + playerList.remove(event.getUsername()); + if (playerList.isEmpty()) { + + gameController.setModel(null); + System.out.println("\n!!! Player list is now empty, ready for a new game init !!!\n"); + } + return true; } - return true; } return false; } @@ -245,7 +245,6 @@ public class ServerLauncher { BlockingQueue actionQueue = new LinkedBlockingQueue<>(); GameController gameController = new GameController(); String IP; - boolean serverCrashed; try { IP=chooseNetworkInterface(new Scanner(System.in)); System.out.println(IP); @@ -266,10 +265,6 @@ public class ServerLauncher { playerList.put(entry.getKey().getUserName(),false); } } - serverCrashed = true; - - } else { - serverCrashed = false; } playerList.setAction(()->{ new Thread(()->{ @@ -281,8 +276,6 @@ public class ServerLauncher { } serverRMI.notifyAll(miniModel); serverTCP.notifyAll(miniModel); - view = new TUI(miniModel); - view.render(); }).start(); }); new Thread(()-> { @@ -295,8 +288,8 @@ public class ServerLauncher { } }).start(); - serverRMI.start(serverCrashed); - new Thread(()->{serverTCP.start(serverCrashed);}).start(); + serverRMI.start(); + new Thread(()->{serverTCP.start();}).start(); System.out.println("Server RMI: "+System.getProperty("java.rmi.server.hostname")); } @@ -314,10 +307,6 @@ public class ServerLauncher { while (true) { try{ this.doFirstEvent(); -// if(view!=null) -// { -// view.fullRender(); -// } } catch(InterruptedException e){ Thread.currentThread().interrupt();