From 251795e0e4a17207dde4705f991504b4f07024d6 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Tue, 26 May 2026 20:56:16 +0200 Subject: [PATCH] Fixed: TCP error sending, Server Crashed on GUIClient --- .../gc14/Network/TCP/Client/TCPClient.java | 16 ++++----- .../Network/TCP/Server/ClientHandler.java | 8 ++--- .../gc14/Network/TCP/Server/TCPServer.java | 33 +++++++++---------- .../it/polimi/ingsw/gc14/View/GUI/GUI.java | 11 +++++-- .../gc14/View/GUI/LoginFXMLController.java | 2 +- 5 files changed, 34 insertions(+), 36 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java index e8afa07..8182ec4 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java @@ -78,20 +78,16 @@ public class TCPClient implements IClient { socketReceive = new ObjectInputStream(communicationSocket.getInputStream()); NetworkEvent event= new AddPlayer(user, proposedNPlayers); socketSend.writeObject(event); - int read= communicationSocket.getInputStream().read(); - if ( read== -1) { - System.out.println("Could not connect to server"); - - try { - if( socketReceive.readObject() instanceof AddPlayer x) - { + try { + if( socketReceive.readObject() instanceof AddPlayer x) + { + if(x.getIsError()) return x.getErrorType(); - } - } catch (ClassNotFoundException e) { - return ErrorType.GENERIC_ERROR; } + } catch (ClassNotFoundException e) { return ErrorType.GENERIC_ERROR; } + new Thread(this::receiveMessage, "tcp-reader").start(); // Socket heartbeat diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java index bd8e2ae..ed811a5 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java @@ -86,11 +86,9 @@ public class ClientHandler implements Runnable { try { running = true; while (running) { - synchronized (out){ - NetworkEvent event = (NetworkEvent) in.readObject(); - if (!actionQueue.add(event)) { - System.out.println("Error inserting action into queue"); - } + NetworkEvent event = (NetworkEvent) in.readObject(); + if (!actionQueue.add(event)) { + System.out.println("Error inserting action into queue"); } } } catch (IOException e) { 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 42ff0c0..8e5af26 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 @@ -137,15 +137,13 @@ public class TCPServer { try { Socket clientSocket = socketTCP.accept(); - ObjectOutputStream clientSend = - new ObjectOutputStream(clientSocket.getOutputStream()); - ObjectInputStream clientReceive = - new ObjectInputStream(clientSocket.getInputStream()); + ObjectOutputStream clientSend = new ObjectOutputStream(clientSocket.getOutputStream()); + clientSend.flush(); + ObjectInputStream clientReceive = new ObjectInputStream(clientSocket.getInputStream()); NetworkEvent event = (NetworkEvent) clientReceive.readObject(); if (!(event.getEventType() == EventType.ADD_PLAYER)) { - clientSocket.getOutputStream().write(-1); clientSocket.close(); System.out.println("Invalid parameters. Connection terminated."); continue; @@ -155,7 +153,9 @@ public class TCPServer { if (eventAddPlayer.getProposedNPlayer() < 2 || eventAddPlayer.getProposedNPlayer() > 5) { - clientSocket.getOutputStream().write(-1); + eventAddPlayer.setErrorType(ErrorType.WRONG_PLAYER_NUMBER); + eventAddPlayer.setIsError(true); + clientSend.writeObject(eventAddPlayer); clientSocket.close(); System.out.println("Invalid parameters. Connection terminated."); continue; @@ -172,18 +172,18 @@ public class TCPServer { } if(controller.getModel().getCurrentState().getGameStage()!= GameStages.WAITING ) { if (!controller.getModel().getPlayers().stream().anyMatch(p -> p.getUserName().equals(username))) { - clientSocket.getOutputStream().write(-1); eventAddPlayer.setErrorType(ErrorType.GAME_ALREADY_STARTED); + eventAddPlayer.setIsError(true); clientSend.writeObject(eventAddPlayer); clientSocket.close(); System.out.println("Invalid parameters. Connection terminated."); + continue; } } else{ if (controller.addPlayer(username)) { playerList.put(username, true); System.out.println("Accepted player: " + username); - ClientHandler handler = new ClientHandler( username, clientSocket, @@ -194,7 +194,7 @@ public class TCPServer { actionQueue ); - clientSocket.getOutputStream().write(1); + clientSend.writeObject(eventAddPlayer); pendingHeartbeat.put(username, handler); Thread thread = new Thread(handler); @@ -206,11 +206,13 @@ public class TCPServer { } else { - clientSocket.getOutputStream().write(-1); + eventAddPlayer.setErrorType(ErrorType.USERNAME_ALREADY_USED); + eventAddPlayer.setIsError(true); clientSend.writeObject(eventAddPlayer); clientSocket.close(); System.out.println("Invalid parameters. Connection terminated."); + continue; } } @@ -218,7 +220,6 @@ public class TCPServer { if (!playerList.containsKey(username)) { playerList.put(username, true); System.out.println("(After crash)Reconnected player: " + username); - ClientHandler handler = new ClientHandler( username, clientSocket, @@ -229,7 +230,7 @@ public class TCPServer { actionQueue ); - clientSocket.getOutputStream().write(1); + clientSend.writeObject(eventAddPlayer); pendingHeartbeat.put(username, handler); Thread thread = new Thread(handler); @@ -237,8 +238,6 @@ public class TCPServer { clientHandlers.add(handler); connectedPlayers++; - continue; - } //reconnect a previously disconnected player else{ @@ -246,7 +245,6 @@ public class TCPServer { playerList.put(username, true); System.out.println("Reconnected player: " + username); - ClientHandler handler = new ClientHandler( username, clientSocket, @@ -257,7 +255,7 @@ public class TCPServer { actionQueue ); - clientSocket.getOutputStream().write(1); + clientSend.writeObject(eventAddPlayer); pendingHeartbeat.put(username, handler); Game game = controller.getModel(); @@ -278,8 +276,9 @@ public class TCPServer { actionQueue.add(new ReconnectPlayer(username)); } else { - clientSocket.getOutputStream().write(-1); + eventAddPlayer.setErrorType(ErrorType.USER_ALREADY_CONNECTED); + eventAddPlayer.setIsError(true); clientSend.writeObject(eventAddPlayer); clientSocket.close(); System.out.println("Invalid parameters. Connection terminated."); diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java index 3bcaa72..feb66be 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java @@ -137,9 +137,14 @@ public class GUI extends Application implements IView { @Override public void showError(ErrorType error,String message) { Platform.runLater(() -> { - synchronized (miniModel) { - controllerMain.isError = true; - controllerMain.render(); + if(error==ErrorType.SERVER_CRASHED){ + primaryStage.setScene(loginScene); + controllerLogin.showError(error); + }else { + synchronized (miniModel) { + controllerMain.isError = true; + controllerMain.render(); + } } }); } diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/LoginFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/LoginFXMLController.java index 32c93e3..8307a7b 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/LoginFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/LoginFXMLController.java @@ -172,7 +172,7 @@ public class LoginFXMLController { } } } - private void showError(ErrorType errorType) { + public void showError(ErrorType errorType) { labelErrore.setTextFill(Color.web("#e05050")); labelErrore.setText(errorType.toString()); }