From fe5e08e5cdccb3addcf47ecf8e2b49e2f62fcf23 Mon Sep 17 00:00:00 2001 From: AleandroPagani Date: Thu, 30 Apr 2026 16:08:13 +0200 Subject: [PATCH] Fix: client TCP complete connection and receive game model --- .../polimi/ingsw/gc14/ClientLauncherTUI.java | 29 +++++++++++++---- .../gc14/Network/RMI/Client/RMIClient.java | 12 ++++--- .../gc14/Network/TCP/Client/TCPClient.java | 9 ++++-- .../Network/TCP/Server/ClientHandler.java | 31 +++++++++---------- .../gc14/Network/TCP/Server/TCPServer.java | 7 +++-- 5 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java b/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java index cb0e1ae..a7e08fa 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14; import it.polimi.ingsw.gc14.Controller.ClientController; import it.polimi.ingsw.gc14.Network.RMI.Client.RMIClient; +import it.polimi.ingsw.gc14.Network.TCP.Client.TCPClient; import it.polimi.ingsw.gc14.View.IView; import java.util.Scanner; @@ -13,21 +14,18 @@ public class ClientLauncherTUI { 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(); if (networkType == 0) { - RMIClient client = new RMIClient("localhost", 1099); - if (client.connect(username, proposedNumPlayers, controller)) { + RMIClient client = new RMIClient(controller, "localhost", 1099); + if (client.connect(username, proposedNumPlayers)) { System.out.println("Succesfully connected to RMI server\n\n"); } else { System.out.println("RMI connection refused\n\n"); @@ -49,7 +47,26 @@ public class ClientLauncherTUI { } else if (networkType == 1) { - return; + TCPClient client = new TCPClient(controller, "localhost", 8080); + if (client.start(username, proposedNumPlayers)) { + System.out.println("Succesfully connected to TCP server\n\n"); + } else { + System.out.println("TCP connection refused\n\n"); + } + + while(true) { + System.out.flush(); + if (controller.localModel!=null) { + break; + } + Thread.sleep(500); + } + System.out.println("Model set\n\n"); + + + System.out.print("\033[H\033[2J"); + System.out.flush(); + System.out.println(controller.localModel); } } } \ No newline at end of file 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 19bd574..3bb68b4 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 @@ -22,13 +22,18 @@ public class RMIClient { /** The remote stub used to call methods on the server */ private IGameServer stub; + /** Client game's controller */ + ClientController controller; + /** * Class constructor. + * @param controller the client controller used to create the callback * @param host the host address of the RMI server * @param port the port of the RMI server */ - public RMIClient(String host, int port) { + public RMIClient(ClientController controller, String host, int port) { + this.controller=controller; this.host = host; this.port = port; } @@ -40,14 +45,13 @@ public class RMIClient { * Then, creates a {@link ClientCallbackImpl} and calls {@link RMIServer#joinGame(String, int, IClientCallback)}. * @param username the player's username * @param preferredInt the desired number of players - * @param clientController the client controller used to create the callback * @return true if the player successfully joined the game, false otherwise */ - public boolean connect(String username,int preferredInt, ClientController clientController) { + public boolean connect(String username,int preferredInt) { try { Registry registry = LocateRegistry.getRegistry(host, port); this.stub = (IGameServer) registry.lookup("RMIGameServer"); - ClientCallbackImpl callback = new ClientCallbackImpl(clientController); + ClientCallbackImpl callback = new ClientCallbackImpl(controller); return stub.joinGame(username, preferredInt, callback); } 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 c69734e..3806ce5 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 @@ -1,5 +1,6 @@ package it.polimi.ingsw.gc14.Network.TCP.Client; +import it.polimi.ingsw.gc14.Controller.ClientController; import it.polimi.ingsw.gc14.Controller.GameController; import it.polimi.ingsw.gc14.Model.Game; import it.polimi.ingsw.gc14.Network.NetworkEvent; @@ -23,7 +24,7 @@ public class TCPClient { ObjectOutputStream socketSend; /** Client game's controller */ - GameController controller; + ClientController controller; /** IP address of the server to connect to */ String hostname; @@ -38,7 +39,7 @@ public class TCPClient { * @param hostname The IP address of the server * @param port The TCP port of the server */ - public TCPClient(GameController controller, String hostname, int port) { + public TCPClient(ClientController controller, String hostname, int port) { this.controller = controller; this.hostname = hostname; this.port = port; @@ -55,10 +56,12 @@ public class TCPClient { */ public boolean start(String user, int proposedNPlayers) { try { + communicationSocket = new Socket(hostname, port); socketSend = new ObjectOutputStream(communicationSocket.getOutputStream()); socketReceive = new ObjectInputStream(communicationSocket.getInputStream()); + sendEvent(new AddPlayer(user, proposedNPlayers)); if (communicationSocket.getInputStream().read() == -1) { System.out.println("Could not connect to server"); @@ -89,7 +92,7 @@ public class TCPClient { if (event.getIsError()) { System.out.println(event); } else { - event.apply(controller); + event.apply(controller.localController); //clientController.view.update(); TODO } } else if (read instanceof Game model) { 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 07864f0..3da705e 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 @@ -41,8 +41,10 @@ public class ClientHandler implements Runnable { * @param clientHandlers The shared list of all active client handlers * @param actionQueue The queue containing incoming events */ - public ClientHandler(Socket clientSocket, List clientHandlers, BlockingQueue actionQueue) { + public ClientHandler(Socket clientSocket, ObjectOutputStream out, ObjectInputStream in, List clientHandlers, BlockingQueue actionQueue) { this.clientSocket = clientSocket; + this.in = in; + this.out = out; this.clientHandlers = clientHandlers; this.actionQueue = actionQueue; } @@ -76,15 +78,13 @@ public class ClientHandler implements Runnable { * Sends a {@link NetworkEvent} to the client. * @param event The network event to send to the client. */ - public void notifyEvent(NetworkEvent event) { - synchronized (out) { - try { - out = new ObjectOutputStream(clientSocket.getOutputStream()); - out.writeObject(event); - } catch (IOException e) { - e.printStackTrace(); - } + public synchronized void notifyEvent(NetworkEvent event) { + try { + out.writeObject(event); + } catch (IOException e) { + e.printStackTrace(); } + } @@ -92,14 +92,11 @@ public class ClientHandler implements Runnable { * Sends the current game model to this client. * @param game The current state of the game to send to the client. */ - public void notifyModel(Game game) { - synchronized (out) { - try { - out = new ObjectOutputStream(clientSocket.getOutputStream()); - out.writeObject(game); - } catch (IOException e) { - e.printStackTrace(); - } + public synchronized void notifyModel(Game game) { + try { + out.writeObject(game); + } catch (IOException e) { + e.printStackTrace(); } } } \ No newline at end of file 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 16c4cfb..55fd6a6 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 @@ -88,8 +88,9 @@ public class TCPServer { try{ clientSocket = socketTCP.accept(); - ObjectInputStream clientSocketObj = new ObjectInputStream(clientSocket.getInputStream()); - NetworkEvent event = (NetworkEvent) clientSocketObj.readObject(); + ObjectOutputStream clientSend = new ObjectOutputStream(clientSocket.getOutputStream()); + ObjectInputStream clientReceive = new ObjectInputStream(clientSocket.getInputStream()); + NetworkEvent event = (NetworkEvent) clientReceive.readObject(); if(!(event.getEventType() == EventType.ADD_PLAYER)){ clientSocket.getOutputStream().write((int)(-1)); @@ -114,7 +115,7 @@ public class TCPServer { clientSocket.getOutputStream().write((int) (1)); System.out.println("Accepted player: " + eventAddPlayer.getUsername()); - ClientHandler clientHandler = new ClientHandler(clientSocket, clientHandlers, actionQueue); + ClientHandler clientHandler = new ClientHandler(clientSocket, clientSend, clientReceive, clientHandlers, actionQueue); clientHandlers.add(clientHandler); ConnectedPlayers++;