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 9a39808..adf63f6 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 @@ -8,11 +8,10 @@ import it.polimi.ingsw.gc14.Network.NetworkEvents.AddPlayer; import java.io.*; import java.net.*; -public class TCPClient implements Serializable{ - Socket communicationSocket = null; +public class TCPClient { + Socket communicationSocket; ObjectInputStream socketReceive; ObjectOutputStream socketSend; - GameController controller; String hostname; int port; @@ -23,43 +22,44 @@ public class TCPClient implements Serializable{ this.port = port; } - public boolean start(String user, int players){ + public boolean start(String user, int proposedNPlayers){ try{ communicationSocket = new Socket(hostname, port); socketSend = new ObjectOutputStream(communicationSocket.getOutputStream()); socketReceive = new ObjectInputStream(communicationSocket.getInputStream()); - socketSend.writeObject(new AddPlayer(user, players)); + sendEvent(new AddPlayer(user, proposedNPlayers)); if(communicationSocket.getInputStream().read() == -1){ + System.out.println("Could not connect to server"); return false; } else{ - Thread listener = new Thread(() -> ReceiveMessage()); + Thread listener = new Thread(() -> receiveMessage()); listener.start(); return true; } - } - catch(Exception e){ + } catch (IOException e) { + e.printStackTrace(); return false; } + } - private void ReceiveMessage(){ + private void receiveMessage(){ while(true){ try{ Object read = socketReceive.readObject(); - if (read instanceof NetworkEvent) { //TODO non fare con instanceof - NetworkEvent event = (NetworkEvent) read; + if (read instanceof NetworkEvent event) { //TODO non fare con instanceof if(event.getIsError()) { - System.out.println(event.toString()); + System.out.println(event); } else { event.apply(controller); //clientController.view.update(); TODO } } - else if (read instanceof Game) { - controller.setModel((Game) read); + else if (read instanceof Game model) { + controller.setModel(model); } } @@ -69,11 +69,10 @@ public class TCPClient implements Serializable{ catch(ClassNotFoundException e){ throw new RuntimeException(e); } - return; } } - private void SendEvent(NetworkEvent event){ + private void sendEvent(NetworkEvent event){ try{ socketSend.writeObject(event); } 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 a989868..1a98f12 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 @@ -1,9 +1,7 @@ package it.polimi.ingsw.gc14.Network.TCP.Server; -import it.polimi.ingsw.gc14.Controller.GameController; import it.polimi.ingsw.gc14.Model.Game; import it.polimi.ingsw.gc14.Network.NetworkEvent; -import it.polimi.ingsw.gc14.Network.EventType; import java.io.*; import java.net.*; @@ -12,12 +10,10 @@ import java.util.concurrent.BlockingQueue; public class ClientHandler implements Runnable { private Socket clientSocket; - private TCPServer server; - public ObjectInputStream in = null; - public ObjectOutputStream out = null; + public ObjectInputStream in; + public ObjectOutputStream out; List clientHandlers; BlockingQueue actionQueue; - private EventType eventType; public Socket getClientSocket() { return clientSocket; @@ -31,33 +27,24 @@ public class ClientHandler implements Runnable { @Override public void run(){ - clientLoop(); - } - - private void clientLoop(){ try{ - NetworkEvent input = null; - synchronized(in){ - in = new ObjectInputStream(clientSocket.getInputStream()); - } + in = new ObjectInputStream(clientSocket.getInputStream()); + out = new ObjectOutputStream(clientSocket.getOutputStream()); + while(true){ - try{ - input = (NetworkEvent) (in.readObject()); - if(!actionQueue.add(input)){ - System.out.println("An error occurred in inserting an action into queue"); - } - } - catch(java.io.IOException e){ - e.printStackTrace(); - } - catch (ClassNotFoundException e){ - throw new RuntimeException(e); + NetworkEvent event = (NetworkEvent) in.readObject(); + if(!actionQueue.add(event)){ + System.out.println("Error inserting action into queue"); } } } - catch (IOException e) { + catch(IOException e){ + clientHandlers.remove(this); e.printStackTrace(); } + catch(ClassNotFoundException e){ + throw new RuntimeException(e); + } } public void notifyEvent(NetworkEvent event){ 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 fc86f84..a8698c2 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 @@ -3,6 +3,7 @@ package it.polimi.ingsw.gc14.Network.TCP.Server; import it.polimi.ingsw.gc14.Controller.GameController; import it.polimi.ingsw.gc14.LimitedList; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.NetworkEvents.AddPlayer; @@ -14,32 +15,29 @@ import java.util.concurrent.BlockingQueue; public class TCPServer { - int port = -1; - int ConnectedPlayers = 0; - ServerSocket serverTCP = null; - GameController gameController; + int port; + int ConnectedPlayers; + ServerSocket serverTCP; + GameController controller; BlockingQueue actionQueue; private LimitedList playerList; private List clientHandlers; - - private int getConnectedPlayers(){ return ConnectedPlayers; } public void start(){ - clientHandlers = new ArrayList<>(); try{ serverTCP = new ServerSocket(port); } catch (IOException e){ - System.out.println("Could not listen on port: " + port); + System.out.println("Could not start the server TCP on port: " + port); e.printStackTrace(); return; } - System.out.println("Listening on port: " + port); + System.out.println("Server TCP started on port: " + port); while(true){ Socket clientSocket = null; @@ -49,34 +47,42 @@ public class TCPServer { ObjectInputStream clientSocketObj = new ObjectInputStream(clientSocket.getInputStream()); NetworkEvent event = (NetworkEvent) clientSocketObj.readObject(); - synchronized (gameController){ - if(!(event instanceof AddPlayer) || (gameController.getModel() != null && gameController.getModel().getCurrentPlayerNumber() >= gameController.getModel().getNPlayers())){ - clientSocket.getOutputStream().write((int)(-1)); + if(!(event.getEventType() == EventType.ADD_PLAYER)){ + clientSocket.getOutputStream().write((int)(-1)); + clientSocket.close(); + System.out.println("Invalid parameters. Connection terminated.\n"); + } + else{ + AddPlayer eventAddPlayer = (AddPlayer) event; + if (eventAddPlayer.getProposedNPlayer() < 2 || eventAddPlayer.getProposedNPlayer() > 5) { + clientSocket.getOutputStream().write((int) (-1)); clientSocket.close(); System.out.println("Invalid parameters. Connection terminated.\n"); } - else{ - synchronized (gameController) { - AddPlayer addPlayer = (AddPlayer) event; - if(playerList.isEmpty() && (addPlayer.getProposedNPlayer() < 2 || addPlayer.getProposedNPlayer() > 5)){ - clientSocket.getOutputStream().write((int)(-1)); - clientSocket.close(); - System.out.println("Invalid parameters. Connection terminated.\n"); - } - else if(gameController.addPlayer(addPlayer.getUsername())){ - if(playerList.isEmpty()){ - Game game = new Game(addPlayer.getProposedNPlayer()); - gameController.setModel(game); - playerList.setLimit(addPlayer.getProposedNPlayer()); - } - playerList.add(addPlayer.getUsername()); - clientSocket.getOutputStream().write((int)(1)); - } + synchronized (controller) { + if (playerList.isEmpty()){ + Game model = new Game(eventAddPlayer.getProposedNPlayer()); + controller.setModel(model); + playerList.setLimit(eventAddPlayer.getProposedNPlayer()); } + if (controller.addPlayer(eventAddPlayer.getUsername())) { + playerList.add(eventAddPlayer.getUsername()); + clientSocket.getOutputStream().write((int) (1)); + System.out.println("Accepted player: " + eventAddPlayer.getUsername()); + ClientHandler clientHandler = new ClientHandler(clientSocket, clientHandlers, actionQueue); + clientHandlers.add(clientHandler); + ConnectedPlayers++; + + Thread t = new Thread(clientHandler); + t.start(); + } else { + clientSocket.getOutputStream().write((int) (-1)); + clientSocket.close(); + System.out.println("Player could not be added. Connection terminated.\n"); + } } } - // gestione di ADD_PLAYER } catch(IOException e){ e.printStackTrace(); @@ -84,38 +90,17 @@ public class TCPServer { catch(ClassNotFoundException e){ throw new RuntimeException(e); } - - System.out.println("Accepted player: " + gameController.getModel().getPlayerByUsername(clientSocket.getInetAddress().toString())); - - ConnectedPlayers++; - ClientHandler clientHandler = new ClientHandler(clientSocket, clientHandlers, actionQueue); - clientHandlers.add(clientHandler); - - //Sending model to clients - if(ConnectedPlayers == gameController.getModel().getNPlayers()){ - for (ClientHandler handler : clientHandlers) { - try { - synchronized(handler.out){ - ObjectOutputStream socketTx = new ObjectOutputStream(handler.getClientSocket().getOutputStream()); - socketTx.writeObject(gameController.getModel()); - } - } - catch(IOException e){ - e.printStackTrace(); - } - } - } - - Thread t = new Thread(clientHandler); - t.start(); } } public TCPServer(GameController gameController, int port, BlockingQueue actionQueue, LimitedList players){ this.port = port; - this.gameController = gameController; + this.ConnectedPlayers = 0; + this.serverTCP = null; + this.controller = gameController; this.actionQueue = actionQueue; this.playerList = players; + this.clientHandlers = new ArrayList<>(); } public void notifyAll(NetworkEvent event){