From dbbb41e12f281ba8ae6f475de2ed0f6102a07d2e Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Wed, 19 Jul 2017 16:05:21 +1200 Subject: [PATCH 1/4] Multiple clients are now shown in lobby of host. When multiple clients connect to the host, the lobby table now fills up with the names of the threads (will need to be changed later). Re-enabled multiple people connecting and the lobby table. Formatting changes in the lobby screen also made. #story[1047] --- .../seng302/controllers/LobbyController.java | 26 ++++++++++++++++--- .../controllers/StartScreenController.java | 12 ++++++--- .../MainServerThread.java | 23 +++++++++++++--- src/main/resources/views/LobbyView.fxml | 25 ++++++++++++++++-- 4 files changed, 72 insertions(+), 14 deletions(-) diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index 4f2b9584..c7835b30 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -1,9 +1,14 @@ package seng302.controllers; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; +import javafx.scene.control.ListView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; @@ -11,8 +16,8 @@ import javafx.scene.text.Text; import seng302.gameServer.GameServerThread; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; - -import java.io.IOException; +import seng302.gameServerWithThreading.MainServerThread; +import seng302.gameServerWithThreading.ServerToClientThread; /** * A class describing the actions of the lobby screen @@ -20,12 +25,15 @@ import java.io.IOException; */ public class LobbyController { + @FXML + private ListView competitorsListView; @FXML private GridPane lobbyScreen; @FXML private Text lobbyIpText; private GameServerThread gameServerThread; + private static ObservableList competitors; private void setContentPane(String jfxUrl) { try { @@ -42,6 +50,11 @@ public class LobbyController { } } + public void initialize() { + competitors = FXCollections.observableArrayList(); + competitorsListView.setItems(competitors); + } + @FXML public void leaveLobbyButtonPressed() { @@ -52,6 +65,11 @@ public class LobbyController { gameServerThread.terminateGame(); } + public static void refreshCompetitors(){ + Collection competitorsIps = MainServerThread.getServerToClientThreads(); + competitors.clear(); + competitors.addAll(competitorsIps); + } @FXML public void readyButtonPressed() { diff --git a/src/main/java/seng302/controllers/StartScreenController.java b/src/main/java/seng302/controllers/StartScreenController.java index 738377a4..04459ff3 100644 --- a/src/main/java/seng302/controllers/StartScreenController.java +++ b/src/main/java/seng302/controllers/StartScreenController.java @@ -80,10 +80,14 @@ public class StartScreenController { public void connectButtonPressed() { // TODO: 10/07/17 wmu16 - Finish function String ipAddress = ipTextField.getText().trim().toLowerCase(); - ClientToServerThread clientToServerThread = new ClientToServerThread(ipAddress, 4950); - controller.setClientToServerThread(clientToServerThread); - clientToServerThread.start(); - + try { + ClientToServerThread clientToServerThread = new ClientToServerThread(ipAddress, 4950); + controller.setClientToServerThread(clientToServerThread); + clientToServerThread.start(); + setContentPane("/views/LobbyView.fxml"); + } catch (Exception e){ + e.printStackTrace(); + } } public void setController(Controller controller) { diff --git a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java b/src/main/java/seng302/gameServerWithThreading/MainServerThread.java index 226e1dc8..7ffb34d2 100644 --- a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java +++ b/src/main/java/seng302/gameServerWithThreading/MainServerThread.java @@ -1,5 +1,9 @@ package seng302.gameServerWithThreading; +import java.util.Collection; +import java.util.Collections; +import javafx.application.Platform; +import seng302.controllers.LobbyController; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; import seng302.models.stream.PacketBufferDelegate; @@ -19,11 +23,11 @@ import java.util.concurrent.PriorityBlockingQueue; public class MainServerThread extends Thread implements PacketBufferDelegate{ private static final int PORT = 4950; - private static final Integer MAX_NUM_PLAYERS = 1; + private static final Integer MAX_NUM_PLAYERS = 3; private ServerSocket serverSocket = null; private Socket socket; - private ArrayList serverToClientThreads = new ArrayList<>(); + private static ArrayList serverToClientThreads = new ArrayList<>(); private PriorityBlockingQueue packetBuffer; @@ -47,7 +51,6 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ } catch (InterruptedException e) { e.printStackTrace(); } - //LOBBYING if (GameState.getCurrentStage() == GameStages.LOBBYING && GameState.getPlayers().size() < MAX_NUM_PLAYERS) { try { @@ -58,6 +61,9 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ } ServerToClientThread thread = new ServerToClientThread(socket, this); serverToClientThreads.add(thread); + System.out.println("[SERVER]: Client found"); + // Platform.runLater() is used to update the UI from within a thread (found on stack overflow) + Platform.runLater(LobbyController::refreshCompetitors); thread.start(); } @@ -72,7 +78,7 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ } - updateClients(); +// updateClients(); while (!packetBuffer.isEmpty()){ System.out.println("WHATUPPP"); @@ -108,4 +114,13 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ System.out.println("HEY HI"); return packetBuffer.add(streamPacket); } + + + public static Collection getServerToClientThreads() { + Collection ips = new ArrayList<>(); + for (ServerToClientThread serverToClientThread: serverToClientThreads){ + ips.add(serverToClientThread.getName()); + } + return Collections.synchronizedCollection(ips); + } } diff --git a/src/main/resources/views/LobbyView.fxml b/src/main/resources/views/LobbyView.fxml index 803c2df1..4e413c61 100644 --- a/src/main/resources/views/LobbyView.fxml +++ b/src/main/resources/views/LobbyView.fxml @@ -15,7 +15,7 @@ - + @@ -41,6 +41,27 @@