From 870dc07fd2dc98ccc11bbf8985548877e83534ad Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Thu, 27 Jul 2017 12:45:22 +1200 Subject: [PATCH 1/5] Slight improvements to hosting. Allow a host/client to disconnect and reconnect/make lobby, leave lobby and play the game. #pair[kre39,hyi25] #story[1047] --- src/main/java/seng302/App.java | 2 + src/main/java/seng302/client/ClientState.java | 2 + .../seng302/client/ClientToServerThread.java | 42 ++++++++++++------- .../java/seng302/controllers/Controller.java | 15 +++++-- .../seng302/controllers/LobbyController.java | 15 +++++-- .../controllers/StartScreenController.java | 4 +- .../java/seng302/gameServer/GameState.java | 4 -- .../seng302/gameServer/MainServerThread.java | 8 +++- 8 files changed, 64 insertions(+), 28 deletions(-) diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index 7069d719..c3b0e7ed 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -7,6 +7,7 @@ import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Stage; import seng302.client.ClientPacketParser; +import seng302.client.ClientState; import seng302.models.PolarTable; import seng302.models.stream.StreamReceiver; @@ -31,6 +32,7 @@ public class App extends Application { System.exit(0); }); + ClientState.primaryStage = primaryStage; } public static void main(String[] args) { diff --git a/src/main/java/seng302/client/ClientState.java b/src/main/java/seng302/client/ClientState.java index 053bc56f..40656dbe 100644 --- a/src/main/java/seng302/client/ClientState.java +++ b/src/main/java/seng302/client/ClientState.java @@ -2,6 +2,7 @@ package seng302.client; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javafx.stage.Stage; import seng302.models.Yacht; /** @@ -17,6 +18,7 @@ public class ClientState { private static Map boats = new ConcurrentHashMap<>(); private static Boolean boatsUpdated = true; private static String clientSourceId = ""; + public static Stage primaryStage; public static String getHostIp() { return hostIp; diff --git a/src/main/java/seng302/client/ClientToServerThread.java b/src/main/java/seng302/client/ClientToServerThread.java index 92a755b2..27dbcd1f 100644 --- a/src/main/java/seng302/client/ClientToServerThread.java +++ b/src/main/java/seng302/client/ClientToServerThread.java @@ -10,6 +10,9 @@ import java.time.LocalDateTime; import java.util.zip.CRC32; import java.util.zip.Checksum; +import javafx.application.Platform; +import javafx.scene.control.Alert; +import javafx.scene.control.Alert.AlertType; import seng302.models.stream.packets.StreamPacket; import seng302.server.messages.BoatActionMessage; import seng302.server.messages.Message; @@ -42,9 +45,10 @@ public class ClientToServerThread implements Runnable { * * @param ipAddress a string of ip address to be connected to * @param portNumber an integer port number - * @throws Exception SocketConnection if fail to connect to ip address and port number combination + * @throws Exception SocketConnection if fail to connect to ip address and port number + * combination */ - public ClientToServerThread(String ipAddress, Integer portNumber) throws Exception{ + public ClientToServerThread(String ipAddress, Integer portNumber) throws Exception { socket = new Socket(ipAddress, portNumber); is = socket.getInputStream(); os = socket.getOutputStream(); @@ -71,9 +75,10 @@ public class ClientToServerThread implements Runnable { * @param message a string of message to be printed out * @param logLevel an int for log level */ - static void clientLog(String message, int logLevel){ - if(logLevel <= LOG_LEVEL){ - System.out.println("[CLIENT " + LocalDateTime.now().toLocalTime().toString() + "] " + message); + static void clientLog(String message, int logLevel) { + if (logLevel <= LOG_LEVEL) { + System.out.println( + "[CLIENT " + LocalDateTime.now().toLocalTime().toString() + "] " + message); } } @@ -85,13 +90,13 @@ public class ClientToServerThread implements Runnable { int sync1; int sync2; // TODO: 14/07/17 wmu16 - Work out how to fix this while loop - while(ClientState.isConnectedToHost()) { + while (ClientState.isConnectedToHost()) { try { crcBuffer = new ByteArrayOutputStream(); sync1 = readByte(); sync2 = readByte(); //checking if it is the start of the packet - if(sync1 == 0x47 && sync2 == 0x83) { + if (sync1 == 0x47 && sync2 == 0x83) { int type = readByte(); //No. of milliseconds since Jan 1st 1970 long timeStamp = Message.bytesToLong(getBytes(6)); @@ -111,7 +116,16 @@ public class ClientToServerThread implements Runnable { } } catch (Exception e) { closeSocket(); - clientLog("Disconnected from server", 1); + Platform.runLater(new Runnable() { + @Override + public void run() { + Alert alert = new Alert(AlertType.ERROR); + alert.setHeaderText("Host has disconnected"); + alert.setContentText("Cannot find Server"); + alert.showAndWait(); + } + }); + clientLog("Disconnected from server", 1); return; } } @@ -122,6 +136,7 @@ public class ClientToServerThread implements Runnable { /** * Listens for an allocated sourceID and returns it to the server + * * @return the sourceID allocated to us by the server */ private Integer threeWayHandshake() { @@ -146,7 +161,6 @@ public class ClientToServerThread implements Runnable { } - /** * Send the post-start race course information */ @@ -176,22 +190,22 @@ public class ClientToServerThread implements Runnable { } catch (IOException e) { clientLog("Read byte failed", 1); } - if (currentByte == -1){ + if (currentByte == -1) { throw new Exception(); } return currentByte; } - private byte[] getBytes(int n) throws Exception{ + private byte[] getBytes(int n) throws Exception { byte[] bytes = new byte[n]; - for (int i = 0; i < n; i++){ + for (int i = 0; i < n; i++) { bytes[i] = (byte) readByte(); } return bytes; } - private void skipBytes(long n) throws Exception{ - for (int i=0; i < n; i++){ + private void skipBytes(long n) throws Exception { + for (int i = 0; i < n; i++) { readByte(); } } diff --git a/src/main/java/seng302/controllers/Controller.java b/src/main/java/seng302/controllers/Controller.java index 550f6f81..f1871192 100644 --- a/src/main/java/seng302/controllers/Controller.java +++ b/src/main/java/seng302/controllers/Controller.java @@ -10,6 +10,7 @@ import javafx.scene.Parent; import javafx.scene.input.KeyEvent; import javafx.scene.layout.AnchorPane; import seng302.client.ClientPacketParser; +import seng302.client.ClientState; import seng302.client.ClientToServerThread; import seng302.server.messages.BoatActionMessage; import seng302.server.messages.BoatActionType; @@ -22,7 +23,7 @@ public class Controller implements Initializable { private long lastSendingTime; private int KEY_STROKE_SENDING_FREQUENCY = 50; - private Object setContentPane(String jfxUrl) { + public Object setContentPane(String jfxUrl) { try { contentPane.getChildren().removeAll(); contentPane.getChildren().clear(); @@ -41,19 +42,25 @@ public class Controller implements Initializable { @Override public void initialize(URL location, ResourceBundle resources) { + setUpStartScreen(); + lastSendingTime = System.currentTimeMillis(); + } + + void setUpStartScreen() { + contentPane.getChildren().removeAll(); + contentPane.getChildren().clear(); contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString()); StartScreenController startScreenController = (StartScreenController) setContentPane("/views/StartScreenView.fxml"); startScreenController.setController(this); ClientPacketParser.boatLocations.clear(); - - lastSendingTime = System.currentTimeMillis(); } + /** Handle the key-pressed event from the text field. */ public void keyPressed(KeyEvent e) { BoatActionMessage boatActionMessage; long currentTime = System.currentTimeMillis(); - if (currentTime - lastSendingTime > KEY_STROKE_SENDING_FREQUENCY) { + if (currentTime - lastSendingTime > KEY_STROKE_SENDING_FREQUENCY && ClientState.isRaceStarted()) { lastSendingTime = currentTime; switch (e.getCode()) { case SPACE: // align with vmg diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index b5f4f791..178f591a 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -85,10 +85,12 @@ public class LobbyController implements Initializable, Observer{ private Boolean switchedPane = false; private MainServerThread mainServerThread; + private Controller controller; private void setContentPane(String jfxUrl) { try { AnchorPane contentPane = (AnchorPane) lobbyScreen.getParent(); + System.out.println(contentPane); contentPane.getChildren().removeAll(); contentPane.getChildren().clear(); contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString()); @@ -200,11 +202,12 @@ public class LobbyController implements Initializable, Observer{ @FXML public void leaveLobbyButtonPressed() { - // TODO: 10/07/17 wmu16 - Finish function! - setContentPane("/views/StartScreenView.fxml"); - GameState.setCurrentStage(GameStages.CANCELLED); - // TODO: 20/07/17 wmu16 - Implement some way of terminating the game + if (ClientState.isHost()) { + GameState.setCurrentStage(GameStages.CANCELLED); + mainServerThread.terminate(); + } ClientState.setConnectedToHost(false); + controller.setUpStartScreen(); } @FXML @@ -224,4 +227,8 @@ public class LobbyController implements Initializable, Observer{ public void setMainServerThread(MainServerThread mainServerThread) { this.mainServerThread = mainServerThread; } + + public void setController(Controller controller) { + this.controller = controller; + } } diff --git a/src/main/java/seng302/controllers/StartScreenController.java b/src/main/java/seng302/controllers/StartScreenController.java index b2503027..f5a9b102 100644 --- a/src/main/java/seng302/controllers/StartScreenController.java +++ b/src/main/java/seng302/controllers/StartScreenController.java @@ -81,6 +81,7 @@ public class StartScreenController { controller.setClientToServerThread(clientToServerThread); LobbyController lobbyController = (LobbyController) setContentPane("/views/LobbyView.fxml"); lobbyController.setMainServerThread(mainServerThread); + lobbyController.setController(controller); } catch (Exception e) { Alert alert = new Alert(AlertType.ERROR); alert.setHeaderText("Cannot host"); @@ -110,7 +111,8 @@ public class StartScreenController { ClientState.setConnectedToHost(true); controller.setClientToServerThread(clientToServerThread); - setContentPane("/views/LobbyView.fxml"); + LobbyController lobbyController = (LobbyController) setContentPane("/views/LobbyView.fxml"); + lobbyController.setController(controller); } catch (Exception e) { Alert alert = new Alert(AlertType.ERROR); alert.setHeaderText("Cannot reach the host"); diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index f4ec9c7c..9dba128c 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -33,10 +33,6 @@ public class GameState implements Runnable { public GameState(String hostIpAddress) { windDirection = 180d; windSpeed = 10000d; - yachts = new HashMap<>(); - players = new ArrayList<>(); - - this.hostIpAddress = hostIpAddress; players = new ArrayList<>(); currentStage = GameStages.LOBBYING; diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index f72b17fd..08688143 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -25,6 +25,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn private static final int PORT = 4942; private static final Integer CLIENT_UPDATES_PER_SECOND = 10; private static final int LOG_LEVEL = 1; + private boolean terminated; private Thread thread; @@ -38,6 +39,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn serverLog("IO error in server thread handler upon trying to make new server socket", 0); } + terminated = false; thread = new Thread(this); thread.start(); } @@ -54,7 +56,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn serverListenThread.start(); //You should handle interrupts in some way, so that the thread won't keep on forever if you exit the app. - while (!thread.isInterrupted()) { + while (!terminated) { try { Thread.sleep(1000 / CLIENT_UPDATES_PER_SECOND); } catch (InterruptedException e) { @@ -148,4 +150,8 @@ public class MainServerThread extends Observable implements Runnable, ClientConn } }, 0, 500); } + + public void terminate() { + terminated = true; + } } From 96ed5e445e3a5743fbaf17eb4bda4f74eba2f55f Mon Sep 17 00:00:00 2001 From: Zhi You Tan Date: Thu, 27 Jul 2017 12:47:18 +1200 Subject: [PATCH 2/5] Replaced print stack trace with print statements --- src/main/java/seng302/App.java | 2 - .../seng302/client/ClientPacketParser.java | 3 +- .../client/ClientStateQueryingRunnable.java | 2 +- .../seng302/controllers/CanvasController.java | 9 +- .../FinishScreenViewController.java | 4 +- .../seng302/controllers/LobbyController.java | 4 +- .../controllers/RaceViewController.java | 2 +- .../controllers/StartScreenController.java | 7 +- .../java/seng302/gameServer/GameState.java | 2 +- .../seng302/gameServer/MainServerThread.java | 2 +- .../gameServer/ServerToClientThread.java | 14 +- src/main/java/seng302/models/PolarTable.java | 2 +- .../java/seng302/models/map/CanvasMap.java | 2 +- .../seng302/models/stream/StreamReceiver.java | 157 ------------------ .../seng302/server/simulator/Simulator.java | 2 +- .../server/simulator/parsers/FileParser.java | 4 +- .../models/stream/StreamReceiverTest.java | 106 ------------ 17 files changed, 27 insertions(+), 297 deletions(-) delete mode 100644 src/main/java/seng302/models/stream/StreamReceiver.java delete mode 100644 src/test/java/seng302/models/stream/StreamReceiverTest.java diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index c3b0e7ed..a65c27d8 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -9,7 +9,6 @@ import javafx.stage.Stage; import seng302.client.ClientPacketParser; import seng302.client.ClientState; import seng302.models.PolarTable; -import seng302.models.stream.StreamReceiver; public class App extends Application { @@ -28,7 +27,6 @@ public class App extends Application { primaryStage.show(); primaryStage.setOnCloseRequest(e -> { ClientPacketParser.appClose(); - StreamReceiver.noMoreBytes(); System.exit(0); }); diff --git a/src/main/java/seng302/client/ClientPacketParser.java b/src/main/java/seng302/client/ClientPacketParser.java index 17ac42e0..bf58c4a1 100644 --- a/src/main/java/seng302/client/ClientPacketParser.java +++ b/src/main/java/seng302/client/ClientPacketParser.java @@ -108,7 +108,6 @@ public class ClientPacketParser { } } catch (NullPointerException e) { System.out.println("Error parsing packet"); -// e.printStackTrace(); } } @@ -287,7 +286,7 @@ public class ClientPacketParser { db = dbf.newDocumentBuilder(); doc = db.parse(new InputSource(new StringReader(xmlMessage))); } catch (ParserConfigurationException | IOException | SAXException e) { - e.printStackTrace(); + System.out.println("[ClientPacketParser] ParserConfigurationException | IOException | SAXException"); } xmlObject.constructXML(doc, messageType); diff --git a/src/main/java/seng302/client/ClientStateQueryingRunnable.java b/src/main/java/seng302/client/ClientStateQueryingRunnable.java index 23adccb0..e704819d 100644 --- a/src/main/java/seng302/client/ClientStateQueryingRunnable.java +++ b/src/main/java/seng302/client/ClientStateQueryingRunnable.java @@ -26,7 +26,7 @@ public class ClientStateQueryingRunnable extends Observable implements Runnable try { Thread.sleep(0); } catch (InterruptedException e) { - e.printStackTrace(); + continue; } if (ClientState.isRaceStarted() && ClientState.isConnectedToHost()) { diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index 3305d180..4e8a8493 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -181,9 +181,9 @@ public class CanvasController { contentPane.getChildren().addAll( (Pane) FXMLLoader.load(getClass().getResource("/views/FinishScreenView.fxml"))); } catch (javafx.fxml.LoadException e) { - e.printStackTrace(); + System.out.println("[Controller] FXML load exception"); } catch (IOException e) { - e.printStackTrace(); + System.out.println("[Controller] IO exception"); } } @@ -282,9 +282,8 @@ public class CanvasController { p2d.getX(), p2d.getY(), heading, positionPacket.getGroundSpeed(), positionPacket.getTimeValid(), frameRate); } catch (InterruptedException e){ - e.printStackTrace(); + System.out.println("[CanvasController] Interrupted Exception"); } -// } } } @@ -297,7 +296,7 @@ public class CanvasController { Point2D p2d = findScaledXY(positionPacket.getLat(), positionPacket.getLon()); markGroup.moveMarkTo(p2d.getX(), p2d.getY(), raceId); } catch (InterruptedException e) { - e.printStackTrace(); + System.out.println("[CanvasController] Interrupted exception"); } } } diff --git a/src/main/java/seng302/controllers/FinishScreenViewController.java b/src/main/java/seng302/controllers/FinishScreenViewController.java index ab3adf0d..170de47f 100644 --- a/src/main/java/seng302/controllers/FinishScreenViewController.java +++ b/src/main/java/seng302/controllers/FinishScreenViewController.java @@ -85,9 +85,9 @@ public class FinishScreenViewController implements Initializable { contentPane.getChildren() .addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl))); } catch (javafx.fxml.LoadException e) { - e.printStackTrace(); + System.out.println("[Controller] FXML load exception"); } catch (IOException e) { - e.printStackTrace(); + System.out.println("[Controller] IO exception"); } } diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index 178f591a..f58ee4ea 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -97,9 +97,9 @@ public class LobbyController implements Initializable, Observer{ contentPane.getChildren() .addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl))); } catch (javafx.fxml.LoadException e) { - e.printStackTrace(); + System.out.println("[Controller] FXML load exception"); } catch (IOException e) { - e.printStackTrace(); + System.out.println("[Controller] IO exception"); } } diff --git a/src/main/java/seng302/controllers/RaceViewController.java b/src/main/java/seng302/controllers/RaceViewController.java index 9bbc0f06..57447081 100644 --- a/src/main/java/seng302/controllers/RaceViewController.java +++ b/src/main/java/seng302/controllers/RaceViewController.java @@ -145,7 +145,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel controller.loadState(importantAnnotations); } catch (IOException e) { - e.printStackTrace(); + System.out.println("[RaceViewController] IO exception"); } } diff --git a/src/main/java/seng302/controllers/StartScreenController.java b/src/main/java/seng302/controllers/StartScreenController.java index f5a9b102..8c1c8531 100644 --- a/src/main/java/seng302/controllers/StartScreenController.java +++ b/src/main/java/seng302/controllers/StartScreenController.java @@ -51,9 +51,9 @@ public class StartScreenController { return fxmlLoader.getController(); } catch (javafx.fxml.LoadException e) { - e.printStackTrace(); + System.out.println("[Controller] FXML load exception"); } catch (IOException e) { - e.printStackTrace(); + System.out.println("[Controller] IO exception"); } return null; } @@ -87,7 +87,6 @@ public class StartScreenController { alert.setHeaderText("Cannot host"); alert.setContentText("Oops, failed to host, try to restart."); alert.showAndWait(); - e.printStackTrace(); } @@ -153,7 +152,7 @@ public class StartScreenController { } } } catch (Exception e) { - e.printStackTrace(); + System.out.println("[StartScreenController] Exception"); } if (ipAddress == null) { System.out.println("[HOST] Cannot obtain local host ip address."); diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 9dba128c..39ba44b4 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -174,7 +174,7 @@ public class GameState implements Runnable { try { Thread.sleep(1000 / STATE_UPDATES_PER_SECOND); } catch (InterruptedException e) { - e.printStackTrace(); + System.out.println("[GameState] interrupted exception"); } if (currentStage == GameStages.PRE_RACE) { update(); diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 08688143..78b87123 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -60,7 +60,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn try { Thread.sleep(1000 / CLIENT_UPDATES_PER_SECOND); } catch (InterruptedException e) { - e.printStackTrace(); + serverLog("Interrupted exception in Main Server Thread thread sleep", 1); } if (GameState.getCurrentStage() == GameStages.PRE_RACE) { diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 94c383cd..7b2641bd 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -96,13 +96,12 @@ public class ServerToClientThread implements Runnable, Observer { all = ln.lines().collect(Collectors.toList()); lName = all.get(ThreadLocalRandom.current().nextInt(0, all.size())); } catch (IOException e) { - System.out.println("IO error in server thread upon grabbing streams"); - e.printStackTrace(); + serverLog("IO error in server thread upon grabbing streams", 1); } //Attempt threeway handshake with connection sourceId = GameState.getUniquePlayerID(); if (threeWayHandshake(sourceId)) { - serverLog("Successful handshake. Client allocated id: " + sourceId, 1); + serverLog("Successful handshake. Client allocated id: " + sourceId, 0); Yacht yacht = new Yacht( "Yacht", sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ" ); @@ -186,7 +185,6 @@ public class ServerToClientThread implements Runnable, Observer { } catch (Exception e) { // TODO: 24/07/17 zyt10 - fix a logic here when a client disconnected // serverLog("ERROR OCCURRED, CLOSING SERVER CONNECTION: " + socket.getRemoteSocketAddress().toString(), 1); -// e.printStackTrace(); closeSocket(); return; } @@ -243,7 +241,7 @@ public class ServerToClientThread implements Runnable, Observer { os.write(id); //Send out new ID looking for echo confirmationID = is.read(); } catch (IOException e) { - e.printStackTrace(); + serverLog("Three way handshake failed", 1); } if (id.equals(confirmationID)) { //ID is echoed back. Connection is a client @@ -273,7 +271,7 @@ public class ServerToClientThread implements Runnable, Observer { currentByte = is.read(); crcBuffer.write(currentByte); } catch (IOException e) { - e.printStackTrace(); + serverLog("Socket read failed", 1); } if (currentByte == -1) { throw new Exception(); @@ -299,10 +297,10 @@ public class ServerToClientThread implements Runnable, Observer { try { os.write(message.getBuffer()); } catch (SocketException e) { - //serverLog("Player " + sourceId + " side socket disconnected", 0); + //serverLog("Player " + sourceId + " side socket disconnected", 1); return; } catch (IOException e) { - e.printStackTrace(); + serverLog("Message send failed", 1); } } diff --git a/src/main/java/seng302/models/PolarTable.java b/src/main/java/seng302/models/PolarTable.java index 396f1947..e76dcaa3 100644 --- a/src/main/java/seng302/models/PolarTable.java +++ b/src/main/java/seng302/models/PolarTable.java @@ -68,7 +68,7 @@ public final class PolarTable { } } catch (IOException e) { - e.printStackTrace(); + System.out.println("[PolarTable] IO exception"); } diff --git a/src/main/java/seng302/models/map/CanvasMap.java b/src/main/java/seng302/models/map/CanvasMap.java index ade3e3da..e6a00cfa 100644 --- a/src/main/java/seng302/models/map/CanvasMap.java +++ b/src/main/java/seng302/models/map/CanvasMap.java @@ -37,7 +37,7 @@ public class CanvasMap { return new Image(connection.getInputStream()); } catch (Exception e) { - e.printStackTrace(); + System.out.println("[CanvasMap] Exception"); return null; } } diff --git a/src/main/java/seng302/models/stream/StreamReceiver.java b/src/main/java/seng302/models/stream/StreamReceiver.java deleted file mode 100644 index 8763a1e4..00000000 --- a/src/main/java/seng302/models/stream/StreamReceiver.java +++ /dev/null @@ -1,157 +0,0 @@ -package seng302.models.stream; - -import seng302.models.stream.packets.StreamPacket; -import seng302.server.messages.BoatActionMessage; -import seng302.server.messages.BoatActionType; -import seng302.server.messages.Heartbeat; -import seng302.server.messages.Message; - -import java.io.*; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.nio.channels.SocketChannel; -import java.util.Comparator; -import java.util.concurrent.PriorityBlockingQueue; -import java.util.zip.CRC32; -import java.util.zip.Checksum; - - -public class StreamReceiver extends Thread { - private InputStream inputStream; - private OutputStream outputStream; - private Socket host; - private ByteArrayOutputStream crcBuffer; - private Thread t; - private String threadName; - public static PriorityBlockingQueue packetBuffer; - private static boolean moreBytes; - - public StreamReceiver(String hostAddress, int hostPort, String threadName) { - this.threadName = threadName; - this.setDaemon(true); - try { - host = new Socket(hostAddress, hostPort); - } catch (IOException e) { - e.printStackTrace(); - System.exit(1); - } - } - - public void run(){ - PriorityBlockingQueue pq = new PriorityBlockingQueue<>(256, new Comparator() { - @Override - public int compare(StreamPacket s1, StreamPacket s2) { - return (int) (s1.getTimeStamp() - s2.getTimeStamp()); - } - }); - packetBuffer = pq; - connect(); - } - - public void start () { - if (t == null) { - t = new Thread (this, threadName); - t.start (); - } - } - - - public StreamReceiver(Socket host, PriorityBlockingQueue packetBuffer){ - this.host=host; - this.packetBuffer = packetBuffer; - } - - - public void connect(){ - -// int sync1; -// int sync2; -// moreBytes = true; -// while(moreBytes) { -// try { -// crcBuffer = new ByteArrayOutputStream(); -// sync1 = readByte(); -// sync2 = readByte(); -// //checking if it is the start of the packet -// if(sync1 == 0x47 && sync2 == 0x83) { -// int type = readByte(); -// //No. of milliseconds since Jan 1st 1970 -// long timeStamp = bytesToLong(getBytes(6)); -// skipBytes(4); -// long payloadLength = bytesToLong(getBytes(2)); -// byte[] payload = getBytes((int) payloadLength); -// Checksum checksum = new CRC32(); -// checksum.update(crcBuffer.toByteArray(), 0, crcBuffer.size()); -// long computedCrc = checksum.getValue(); -// long packetCrc = bytesToLong(getBytes(4)); -// if (computedCrc == packetCrc) { -// packetBuffer.add(new StreamPacket(type, payloadLength, timeStamp, payload)); -// } else { -// System.err.println("Packet has been dropped"); -// } -// } -// } catch (Exception e) { -// moreBytes = false; -// } -// } - } - - private int readByte() throws Exception { - int currentByte = -1; - try { - currentByte = inputStream.read(); - crcBuffer.write(currentByte); - } catch (IOException e) { - e.printStackTrace(); - } - if (currentByte == -1){ - throw new Exception(); - } - return currentByte; - } - - private byte[] getBytes(int n) throws Exception{ - byte[] bytes = new byte[n]; - for (int i = 0; i < n; i++){ - bytes[i] = (byte) readByte(); - } - return bytes; - } - - private void skipBytes(long n) throws Exception{ - for (int i=0; i < n; i++){ - readByte(); - } - } - - /** - * takes an array of up to 7 bytes in little endian format and - * returns a positive long constructed from the input bytes - * - * @return a positive long if there is less than 8 bytes -1 otherwise - */ - private long bytesToLong(byte[] bytes){ - long partialLong = 0; - int index = 0; - for (byte b: bytes){ - if (index > 6){ - return -1; - } - partialLong = partialLong | (b & 0xFFL) << (index * 8); - index++; - } - return partialLong; - } - - public static void main(String[] args) { - - StreamReceiver sr = new StreamReceiver("csse-s302staff.canterbury.ac.nz", 4941,"TestThread1"); - //StreamReceiver sr = new StreamReceiver("livedata.americascup.com", 4941, "TestThread2"); - sr.start(); - - } - - public static void noMoreBytes(){ - moreBytes = false; - } -} diff --git a/src/main/java/seng302/server/simulator/Simulator.java b/src/main/java/seng302/server/simulator/Simulator.java index 7d777912..363977c9 100644 --- a/src/main/java/seng302/server/simulator/Simulator.java +++ b/src/main/java/seng302/server/simulator/Simulator.java @@ -62,7 +62,7 @@ public class Simulator extends Observable implements Runnable { try { Thread.sleep(lapse); } catch (InterruptedException e) { - e.printStackTrace(); + System.out.println("[Simulator] interrupted exception "); } } } diff --git a/src/main/java/seng302/server/simulator/parsers/FileParser.java b/src/main/java/seng302/server/simulator/parsers/FileParser.java index 94910720..d724e0bc 100644 --- a/src/main/java/seng302/server/simulator/parsers/FileParser.java +++ b/src/main/java/seng302/server/simulator/parsers/FileParser.java @@ -31,7 +31,7 @@ public abstract class FileParser { doc.getDocumentElement().normalize(); return doc; } catch (Exception e) { - e.printStackTrace(); + System.out.println("[FileParser] Exception"); return null; } } @@ -45,7 +45,7 @@ public abstract class FileParser { doc.getDocumentElement().normalize(); return doc; } catch (Exception e) { - e.printStackTrace(); + System.out.println("[FileParser] Exception"); } return null; } diff --git a/src/test/java/seng302/models/stream/StreamReceiverTest.java b/src/test/java/seng302/models/stream/StreamReceiverTest.java deleted file mode 100644 index 082f9128..00000000 --- a/src/test/java/seng302/models/stream/StreamReceiverTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package seng302.models.stream; - -import org.junit.Before; -import org.junit.Test; - -import java.io.*; -import java.lang.reflect.Method; -import java.net.Socket; -import java.util.Comparator; -import java.util.concurrent.PriorityBlockingQueue; -import seng302.models.stream.packets.StreamPacket; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * Created by ptg19 on 26/04/17. - */ -public class StreamReceiverTest { - - private PriorityBlockingQueue pq; - private byte[] brokenPacket = {0x47, (byte) 0x83, 37, // sync1 sync2 and message type - 0b00000000, 0b01000000, 0b00100010, 0b00100100, 0b00011000, 0b00000000, //timestamp - 0b00000000, 0b00010000, 0b01000000, 0b00000000, //source id - 0b00100010, 0b00101000, // message length - 0b00010010, 0b00010010, 0b00010010}; //random start of payload - - private byte[] workingPacket = {0x47, (byte) 0x83, 37, // sync1 sync2 and message type - 0b00000000, 0b01000000, 0b00100010, 0b00100100, 0b00011000, 0b00000000, //timestamp - 0b00000000, 0b00010000, 0b01000000, 0b00000000, //source id - 0b00000010, 0b00000000, // message length - 0b00010010, 0b00010010, // payload - 0b00100110, (byte)0b10000111, 0b00110101, 0b01111000}; //crc - - private byte[] crcMismatchPacket = {0x47, (byte) 0x83, 37, // sync1 sync2 and message type - 0b00000000, 0b01000000, 0b00100010, 0b00100100, 0b00011000, 0b00000000, //timestamp - 0b00000000, 0b00000000, 0b01000000, 0b00000000, //source id - 0b00000010, 0b00000000, // message length - 0b00010010, 0b00010010, // payload - 0b00100110, (byte)0b10000111, 0b00110101, 0b01111000}; //crc - - - @Before - public void setup(){ - pq = new PriorityBlockingQueue<>(256, new Comparator() { - @Override - public int compare(StreamPacket s1, StreamPacket s2) { - return (int) (s1.getTimeStamp() - s2.getTimeStamp()); - } - }); - } - - @Test - public void connectExitsOnUnexpectedStreamEnd() throws Exception { - Socket host=mock(Socket.class); - InputStream stream = new ByteArrayInputStream(brokenPacket); - when(host.getInputStream()).thenReturn(stream); - StreamReceiver streamReceiver = new StreamReceiver(host, pq); - - streamReceiver.connect(); - assert pq.size() == 0; - } - -// @Test -// public void connectReadsAPacket() throws Exception { -// Socket host=mock(Socket.class); -// InputStream stream = new ByteArrayInputStream(workingPacket); -// when(host.getInputStream()).thenReturn(stream); -// StreamReceiver streamReceiver = new StreamReceiver(host, pq); -// -// streamReceiver.connect(); -// assert pq.size() == 1; -// } - - @Test - public void connectDropsAMismatchedCrc() throws Exception { - Socket host=mock(Socket.class); - InputStream stream = new ByteArrayInputStream(crcMismatchPacket); - when(host.getInputStream()).thenReturn(stream); - StreamReceiver streamReceiver = new StreamReceiver(host, pq); - - streamReceiver.connect(); - assert pq.size() == 0; - } - - @Test - public void bytestoLongTest() { - Socket host=mock(Socket.class); - StreamReceiver streamReceiver = new StreamReceiver(host, pq); - try { - Class[] args = new Class[1]; - args[0] = byte[].class; - Method bytesToLong = streamReceiver.getClass().getDeclaredMethod("bytesToLong", args); - bytesToLong.setAccessible(true); - byte[] sevenBtyeNumber = {0b01100100, 0b00110100, 0b00010100, 0b00000000, 0b00000000, 0b00000000, (byte)0b10000000}; - assert bytesToLong.invoke(streamReceiver, sevenBtyeNumber).equals(36028797020288100L); - byte[] eightByteNumber = {0b01100100, 0b00110100, 0b00010100, 0b00000000, 0b00000000, 0b00000000, (byte)0b10000000, 0b00100101}; - assert bytesToLong.invoke(streamReceiver, eightByteNumber).equals(-1L); - byte[] emptyArray = {}; - assert bytesToLong.invoke(streamReceiver, emptyArray).equals(0L); - } catch (Exception e){ - e.printStackTrace(); - } - } - -} \ No newline at end of file From c2c34705d5699a5e1e32b7ea4035a468a6c0a370 Mon Sep 17 00:00:00 2001 From: Zhi You Tan Date: Thu, 27 Jul 2017 13:01:04 +1200 Subject: [PATCH 3/5] removed an unnecessary print statement and caught an exception --- src/main/java/seng302/controllers/LobbyController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index f58ee4ea..bd4b5351 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -90,7 +90,6 @@ public class LobbyController implements Initializable, Observer{ private void setContentPane(String jfxUrl) { try { AnchorPane contentPane = (AnchorPane) lobbyScreen.getParent(); - System.out.println(contentPane); contentPane.getChildren().removeAll(); contentPane.getChildren().clear(); contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString()); @@ -100,6 +99,8 @@ public class LobbyController implements Initializable, Observer{ System.out.println("[Controller] FXML load exception"); } catch (IOException e) { System.out.println("[Controller] IO exception"); + } catch (NullPointerException e) { +// System.out.println("[Controller] Null Pointer Exception"); } } From 1d9dd763567786ef0513e6908960330eb7b7fbdf Mon Sep 17 00:00:00 2001 From: Zhi You Tan Date: Thu, 27 Jul 2017 13:12:53 +1200 Subject: [PATCH 4/5] For client's lobby view, it now can shows the connected host IP #story[1055] --- src/main/java/seng302/controllers/LobbyController.java | 2 +- src/main/java/seng302/controllers/StartScreenController.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index bd4b5351..b9d407fe 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -111,7 +111,7 @@ public class LobbyController implements Initializable, Observer{ readyButton.setDisable(false); } else { - lobbyIpText.setText("Connected to IP: "); + lobbyIpText.setText("Connected to IP: " + ClientState.getHostIp()); readyButton.setDisable(true); } diff --git a/src/main/java/seng302/controllers/StartScreenController.java b/src/main/java/seng302/controllers/StartScreenController.java index 8c1c8531..b7376287 100644 --- a/src/main/java/seng302/controllers/StartScreenController.java +++ b/src/main/java/seng302/controllers/StartScreenController.java @@ -109,6 +109,7 @@ public class StartScreenController { ClientState.setHost(false); ClientState.setConnectedToHost(true); + ClientState.setHostIp(ipAddress); controller.setClientToServerThread(clientToServerThread); LobbyController lobbyController = (LobbyController) setContentPane("/views/LobbyView.fxml"); lobbyController.setController(controller); From 25d8c8f9c4f9db20e3075b6e9896cebfe2db30f7 Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Thu, 27 Jul 2017 14:15:55 +1200 Subject: [PATCH 5/5] Minor bug fixes. Server will now only save incoming connections if in lobbying mode as it should Commented out boat status printing tags: #story[1047] --- .../java/seng302/gameServer/GameState.java | 18 +++++++++++------- .../seng302/gameServer/ServerListenThread.java | 4 +++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 39ba44b4..16eb8050 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -136,13 +136,7 @@ public class GameState implements Runnable { break; } - System.out.println("-----------------------"); - System.out.println("Sails are in: " + playerYacht.getSailIn()); - System.out.println("Heading: " + playerYacht.getHeading()); - System.out.println("Velocity: " + playerYacht.getVelocityMMS() / 1000); - System.out.println("Lat: " + playerYacht.getLocation().getLat()); - System.out.println("Lng: " + playerYacht.getLocation().getLng()); - System.out.println("-----------------------\n"); +// printBoatStatus(playerYacht); } public static void update() { @@ -186,4 +180,14 @@ public class GameState implements Runnable { } } } + + private static void printBoatStatus(Yacht playerYacht) { + System.out.println("-----------------------"); + System.out.println("Sails are in: " + playerYacht.getSailIn()); + System.out.println("Heading: " + playerYacht.getHeading()); + System.out.println("Velocity: " + playerYacht.getVelocityMMS() / 1000); + System.out.println("Lat: " + playerYacht.getLocation().getLat()); + System.out.println("Lng: " + playerYacht.getLocation().getLng()); + System.out.println("-----------------------\n"); + } } diff --git a/src/main/java/seng302/gameServer/ServerListenThread.java b/src/main/java/seng302/gameServer/ServerListenThread.java index f36d08df..475f2cd9 100644 --- a/src/main/java/seng302/gameServer/ServerListenThread.java +++ b/src/main/java/seng302/gameServer/ServerListenThread.java @@ -27,9 +27,11 @@ public class ServerListenThread extends Thread{ private void acceptConnection() { try { Socket thisClient = serverSocket.accept(); - if (thisClient != null){ + if (thisClient != null && GameState.getCurrentStage().equals(GameStages.LOBBYING)) { ServerToClientThread thisConnection = new ServerToClientThread(thisClient); delegate.clientConnected(thisConnection); + } else { + thisClient.close(); } } catch (IOException e) { e.getMessage();