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());
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)
{
if(x.getIsError())
return x.getErrorType();
}
} catch (ClassNotFoundException e) {
return ErrorType.GENERIC_ERROR;
}
return ErrorType.GENERIC_ERROR;
}
new Thread(this::receiveMessage, "tcp-reader").start();
// Socket heartbeat
@@ -86,13 +86,11 @@ 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");
}
}
}
} catch (IOException e) {
System.err.println("Error in incoming connection/disconnection");
} catch (ClassNotFoundException e) {
@@ -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.");
@@ -137,10 +137,15 @@ public class GUI extends Application implements IView {
@Override
public void showError(ErrorType error,String message) {
Platform.runLater(() -> {
if(error==ErrorType.SERVER_CRASHED){
primaryStage.setScene(loginScene);
controllerLogin.showError(error);
}else {
synchronized (miniModel) {
controllerMain.isError = true;
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.setText(errorType.toString());
}