Fixed: TCP error sending, Server Crashed on GUIClient

This commit is contained in:
rubenpirreram
2026-05-26 20:56:16 +02:00
parent 2efee34f9f
commit 251795e0e4
5 changed files with 34 additions and 36 deletions
@@ -78,20 +78,16 @@ public class TCPClient implements IClient {
socketReceive = new ObjectInputStream(communicationSocket.getInputStream()); socketReceive = new ObjectInputStream(communicationSocket.getInputStream());
NetworkEvent event= new AddPlayer(user, proposedNPlayers); NetworkEvent event= new AddPlayer(user, proposedNPlayers);
socketSend.writeObject(event); socketSend.writeObject(event);
int read= communicationSocket.getInputStream().read();
if ( read== -1) {
System.out.println("Could not connect to server");
try { try {
if( socketReceive.readObject() instanceof AddPlayer x) if( socketReceive.readObject() instanceof AddPlayer x)
{ {
if(x.getIsError())
return x.getErrorType(); return x.getErrorType();
} }
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
return ErrorType.GENERIC_ERROR; return ErrorType.GENERIC_ERROR;
} }
return ErrorType.GENERIC_ERROR;
}
new Thread(this::receiveMessage, "tcp-reader").start(); new Thread(this::receiveMessage, "tcp-reader").start();
// Socket heartbeat // Socket heartbeat
@@ -86,13 +86,11 @@ public class ClientHandler implements Runnable {
try { try {
running = true; running = true;
while (running) { while (running) {
synchronized (out){
NetworkEvent event = (NetworkEvent) in.readObject(); NetworkEvent event = (NetworkEvent) in.readObject();
if (!actionQueue.add(event)) { if (!actionQueue.add(event)) {
System.out.println("Error inserting action into queue"); System.out.println("Error inserting action into queue");
} }
} }
}
} catch (IOException e) { } catch (IOException e) {
System.err.println("Error in incoming connection/disconnection"); System.err.println("Error in incoming connection/disconnection");
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
@@ -137,15 +137,13 @@ public class TCPServer {
try { try {
Socket clientSocket = socketTCP.accept(); Socket clientSocket = socketTCP.accept();
ObjectOutputStream clientSend = ObjectOutputStream clientSend = new ObjectOutputStream(clientSocket.getOutputStream());
new ObjectOutputStream(clientSocket.getOutputStream()); clientSend.flush();
ObjectInputStream clientReceive = ObjectInputStream clientReceive = new ObjectInputStream(clientSocket.getInputStream());
new ObjectInputStream(clientSocket.getInputStream());
NetworkEvent event = (NetworkEvent) clientReceive.readObject(); NetworkEvent event = (NetworkEvent) clientReceive.readObject();
if (!(event.getEventType() == EventType.ADD_PLAYER)) { if (!(event.getEventType() == EventType.ADD_PLAYER)) {
clientSocket.getOutputStream().write(-1);
clientSocket.close(); clientSocket.close();
System.out.println("Invalid parameters. Connection terminated."); System.out.println("Invalid parameters. Connection terminated.");
continue; continue;
@@ -155,7 +153,9 @@ public class TCPServer {
if (eventAddPlayer.getProposedNPlayer() < 2 if (eventAddPlayer.getProposedNPlayer() < 2
|| eventAddPlayer.getProposedNPlayer() > 5) { || eventAddPlayer.getProposedNPlayer() > 5) {
clientSocket.getOutputStream().write(-1); eventAddPlayer.setErrorType(ErrorType.WRONG_PLAYER_NUMBER);
eventAddPlayer.setIsError(true);
clientSend.writeObject(eventAddPlayer);
clientSocket.close(); clientSocket.close();
System.out.println("Invalid parameters. Connection terminated."); System.out.println("Invalid parameters. Connection terminated.");
continue; continue;
@@ -172,18 +172,18 @@ public class TCPServer {
} }
if(controller.getModel().getCurrentState().getGameStage()!= GameStages.WAITING ) { if(controller.getModel().getCurrentState().getGameStage()!= GameStages.WAITING ) {
if (!controller.getModel().getPlayers().stream().anyMatch(p -> p.getUserName().equals(username))) { if (!controller.getModel().getPlayers().stream().anyMatch(p -> p.getUserName().equals(username))) {
clientSocket.getOutputStream().write(-1);
eventAddPlayer.setErrorType(ErrorType.GAME_ALREADY_STARTED); eventAddPlayer.setErrorType(ErrorType.GAME_ALREADY_STARTED);
eventAddPlayer.setIsError(true);
clientSend.writeObject(eventAddPlayer); clientSend.writeObject(eventAddPlayer);
clientSocket.close(); clientSocket.close();
System.out.println("Invalid parameters. Connection terminated."); System.out.println("Invalid parameters. Connection terminated.");
continue;
} }
} }
else{ else{
if (controller.addPlayer(username)) { if (controller.addPlayer(username)) {
playerList.put(username, true); playerList.put(username, true);
System.out.println("Accepted player: " + username); System.out.println("Accepted player: " + username);
ClientHandler handler = new ClientHandler( ClientHandler handler = new ClientHandler(
username, username,
clientSocket, clientSocket,
@@ -194,7 +194,7 @@ public class TCPServer {
actionQueue actionQueue
); );
clientSocket.getOutputStream().write(1); clientSend.writeObject(eventAddPlayer);
pendingHeartbeat.put(username, handler); pendingHeartbeat.put(username, handler);
Thread thread = new Thread(handler); Thread thread = new Thread(handler);
@@ -206,11 +206,13 @@ public class TCPServer {
} }
else { else {
clientSocket.getOutputStream().write(-1);
eventAddPlayer.setErrorType(ErrorType.USERNAME_ALREADY_USED); eventAddPlayer.setErrorType(ErrorType.USERNAME_ALREADY_USED);
eventAddPlayer.setIsError(true);
clientSend.writeObject(eventAddPlayer); clientSend.writeObject(eventAddPlayer);
clientSocket.close(); clientSocket.close();
System.out.println("Invalid parameters. Connection terminated."); System.out.println("Invalid parameters. Connection terminated.");
continue;
} }
} }
@@ -218,7 +220,6 @@ public class TCPServer {
if (!playerList.containsKey(username)) { if (!playerList.containsKey(username)) {
playerList.put(username, true); playerList.put(username, true);
System.out.println("(After crash)Reconnected player: " + username); System.out.println("(After crash)Reconnected player: " + username);
ClientHandler handler = new ClientHandler( ClientHandler handler = new ClientHandler(
username, username,
clientSocket, clientSocket,
@@ -229,7 +230,7 @@ public class TCPServer {
actionQueue actionQueue
); );
clientSocket.getOutputStream().write(1); clientSend.writeObject(eventAddPlayer);
pendingHeartbeat.put(username, handler); pendingHeartbeat.put(username, handler);
Thread thread = new Thread(handler); Thread thread = new Thread(handler);
@@ -237,8 +238,6 @@ public class TCPServer {
clientHandlers.add(handler); clientHandlers.add(handler);
connectedPlayers++; connectedPlayers++;
continue;
} }
//reconnect a previously disconnected player //reconnect a previously disconnected player
else{ else{
@@ -246,7 +245,6 @@ public class TCPServer {
playerList.put(username, true); playerList.put(username, true);
System.out.println("Reconnected player: " + username); System.out.println("Reconnected player: " + username);
ClientHandler handler = new ClientHandler( ClientHandler handler = new ClientHandler(
username, username,
clientSocket, clientSocket,
@@ -257,7 +255,7 @@ public class TCPServer {
actionQueue actionQueue
); );
clientSocket.getOutputStream().write(1); clientSend.writeObject(eventAddPlayer);
pendingHeartbeat.put(username, handler); pendingHeartbeat.put(username, handler);
Game game = controller.getModel(); Game game = controller.getModel();
@@ -278,8 +276,9 @@ public class TCPServer {
actionQueue.add(new ReconnectPlayer(username)); actionQueue.add(new ReconnectPlayer(username));
} else { } else {
clientSocket.getOutputStream().write(-1);
eventAddPlayer.setErrorType(ErrorType.USER_ALREADY_CONNECTED); eventAddPlayer.setErrorType(ErrorType.USER_ALREADY_CONNECTED);
eventAddPlayer.setIsError(true);
clientSend.writeObject(eventAddPlayer); clientSend.writeObject(eventAddPlayer);
clientSocket.close(); clientSocket.close();
System.out.println("Invalid parameters. Connection terminated."); System.out.println("Invalid parameters. Connection terminated.");
@@ -137,10 +137,15 @@ public class GUI extends Application implements IView {
@Override @Override
public void showError(ErrorType error,String message) { public void showError(ErrorType error,String message) {
Platform.runLater(() -> { Platform.runLater(() -> {
if(error==ErrorType.SERVER_CRASHED){
primaryStage.setScene(loginScene);
controllerLogin.showError(error);
}else {
synchronized (miniModel) { synchronized (miniModel) {
controllerMain.isError = true; controllerMain.isError = true;
controllerMain.render(); controllerMain.render();
} }
}
}); });
} }
@@ -172,7 +172,7 @@ public class LoginFXMLController {
} }
} }
} }
private void showError(ErrorType errorType) { public void showError(ErrorType errorType) {
labelErrore.setTextFill(Color.web("#e05050")); labelErrore.setTextFill(Color.web("#e05050"));
labelErrore.setText(errorType.toString()); labelErrore.setText(errorType.toString());
} }