From b1575e57dfa2e60b0d4d28b8fe237c13f54337cc Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Thu, 20 Jul 2017 13:53:53 +1200 Subject: [PATCH] Host also can be it's own client. The host can connect to itself to become a client, packets are also sending from the host to client, update method should be ready to fully implemented. Added chatter packets to packet types to be used mostly for testing but can be further implemented for proper use in the future. #story[1055] --- .../seng302/client/ClientToServerThread.java | 1 - .../seng302/controllers/LobbyController.java | 2 + .../controllers/RaceViewController.java | 18 ++++----- .../controllers/StartScreenController.java | 5 ++- .../seng302/gameServer/MainServerThread.java | 12 +++++- .../gameServer/ServerToClientThread.java | 16 ++++++++ .../seng302/models/stream/StreamParser.java | 2 + .../server/messages/BoatActionMessage.java | 1 + .../server/messages/ChatterMessage.java | 38 +++++++++++++++++++ .../java/seng302/server/messages/Message.java | 1 - 10 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 src/main/java/seng302/server/messages/ChatterMessage.java diff --git a/src/main/java/seng302/client/ClientToServerThread.java b/src/main/java/seng302/client/ClientToServerThread.java index 6a7b995d..216315dc 100644 --- a/src/main/java/seng302/client/ClientToServerThread.java +++ b/src/main/java/seng302/client/ClientToServerThread.java @@ -60,7 +60,6 @@ public class ClientToServerThread extends Thread { // } updateClient = false; } - crcBuffer = new ByteArrayOutputStream(); sync1 = readByte(); sync2 = readByte(); diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index 3f03783f..565812cc 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -103,5 +103,7 @@ public class LobbyController implements Initializable{ @FXML public void readyButtonPressed() { GameState.setCurrentStage(GameStages.RACING); + setContentPane("/views/RaceView.fxml"); + } } diff --git a/src/main/java/seng302/controllers/RaceViewController.java b/src/main/java/seng302/controllers/RaceViewController.java index 8eb336e7..397b54cb 100644 --- a/src/main/java/seng302/controllers/RaceViewController.java +++ b/src/main/java/seng302/controllers/RaceViewController.java @@ -95,16 +95,16 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel raceSparkLine.getYAxis().setTranslateX(-5); raceSparkLine.getYAxis().setAutoRanging(false); sparklineYAxis.setTickMarkVisible(false); - startingBoats = new ArrayList<>(StreamParser.getBoats().values()); + //startingBoats = new ArrayList<>(StreamParser.getBoats().values()); - includedCanvasController.setup(this); - includedCanvasController.initializeCanvas(); - initializeUpdateTimer(); - initialiseFPSCheckBox(); - initialiseAnnotationSlider(); - initialiseBoatSelectionComboBox(); - includedCanvasController.timer.start(); - selectAnnotationBtn.setOnAction(event -> loadSelectAnnotationView()); + //includedCanvasController.setup(this); + //includedCanvasController.initializeCanvas(); + //initializeUpdateTimer(); + //initialiseFPSCheckBox(); + //initialiseAnnotationSlider(); + //initialiseBoatSelectionComboBox(); + //includedCanvasController.timer.start(); + //selectAnnotationBtn.setOnAction(event -> loadSelectAnnotationView()); } diff --git a/src/main/java/seng302/controllers/StartScreenController.java b/src/main/java/seng302/controllers/StartScreenController.java index eb5990f0..6f9a094c 100644 --- a/src/main/java/seng302/controllers/StartScreenController.java +++ b/src/main/java/seng302/controllers/StartScreenController.java @@ -40,7 +40,6 @@ public class StartScreenController { contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString()); FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(jfxUrl)); contentPane.getChildren().addAll((Pane) fxmlLoader.load()); - return fxmlLoader.getController(); } catch (javafx.fxml.LoadException e) { e.printStackTrace(); @@ -63,6 +62,10 @@ public class StartScreenController { String ipAddress = InetAddress.getLocalHost().getHostAddress(); new GameState(ipAddress); new MainServerThread().start(); + ClientToServerThread clientToServerThread = new ClientToServerThread("localhost", 4950); + controller.setClientToServerThread(clientToServerThread); + clientToServerThread.start(); +// new GameServerThread("Fuck you"); // get the lobby controller so that we can pass the game server thread to it setContentPane("/views/LobbyView.fxml"); diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 8caf5e9c..df6c1fcc 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -58,9 +58,10 @@ public class MainServerThread extends Thread implements PacketBufferDelegate, Cl } + //RACING if (GameState.getCurrentStage() == GameStages.RACING) { - + updateClients(); } @@ -68,9 +69,9 @@ public class MainServerThread extends Thread implements PacketBufferDelegate, Cl else if (GameState.getCurrentStage() == GameStages.FINISHED) { } - updateClients(); + while (!packetBuffer.isEmpty()){ System.out.println("WHATUPPP"); try { @@ -114,6 +115,13 @@ public class MainServerThread extends Thread implements PacketBufferDelegate, Cl return packetBuffer.add(streamPacket); } + private void initializeRace(){ + for (ServerToClientThread serverToClientThread : serverToClientThreads) { + serverToClientThread.updateClient(); + } + } + + /** * A client has tried to connect to the server * @param serverToClientThread The player that connected diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 7198875c..6ea157bf 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -5,6 +5,8 @@ import seng302.models.Player; import seng302.models.stream.PacketBufferDelegate; import seng302.models.stream.StreamParser; import seng302.models.stream.packets.StreamPacket; +import seng302.server.messages.ChatterMessage; +import seng302.server.messages.Heartbeat; import seng302.server.messages.Message; import java.io.*; @@ -54,6 +56,9 @@ public class ServerToClientThread extends Thread { //Perform a write if it is time to as delegated by the MainServerThread if (updateClient) { // TODO: 13/07/17 wmu16 - Write out game state - some function that would write all appropriate messages to this output stream + ChatterMessage chatterMessage = new ChatterMessage(4, 14, "Hello, it's me"); + sendMessage(chatterMessage); + // try { // GameState.outputState(os); // } catch (IOException e) { @@ -62,9 +67,11 @@ public class ServerToClientThread extends Thread { updateClient = false; } + crcBuffer = new ByteArrayOutputStream(); sync1 = readByte(); sync2 = readByte(); + //checking if it is the start of the packet if(sync1 == 0x47 && sync2 == 0x83) { int type = readByte(); @@ -86,6 +93,7 @@ public class ServerToClientThread extends Thread { } } } catch (Exception e) { + e.printStackTrace(); closeSocket(); return; } @@ -162,4 +170,12 @@ public class ServerToClientThread extends Thread { readByte(); } } + + public void sendMessage(Message message){ + try { + os.write(message.getBuffer()); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/seng302/models/stream/StreamParser.java b/src/main/java/seng302/models/stream/StreamParser.java index f1ea501a..a1c0d985 100644 --- a/src/main/java/seng302/models/stream/StreamParser.java +++ b/src/main/java/seng302/models/stream/StreamParser.java @@ -123,6 +123,7 @@ public class StreamParser{ */ private static void extractHeartBeat(StreamPacket packet) { long heartbeat = bytesToLong(packet.getPayload()); + System.out.println("heartbeat = " + heartbeat); } private static String getTimeZoneString() { @@ -354,6 +355,7 @@ public class StreamParser{ int messageType = payload[1]; int length = payload[2]; String message = new String(Arrays.copyOfRange(payload, 3, 3 + length)); + System.out.println(message); } /** diff --git a/src/main/java/seng302/server/messages/BoatActionMessage.java b/src/main/java/seng302/server/messages/BoatActionMessage.java index 9dfc5769..4a53f40a 100644 --- a/src/main/java/seng302/server/messages/BoatActionMessage.java +++ b/src/main/java/seng302/server/messages/BoatActionMessage.java @@ -29,4 +29,5 @@ public class BoatActionMessage extends Message{ return MESSAGE_SIZE; } + } diff --git a/src/main/java/seng302/server/messages/ChatterMessage.java b/src/main/java/seng302/server/messages/ChatterMessage.java new file mode 100644 index 00000000..8480a9d5 --- /dev/null +++ b/src/main/java/seng302/server/messages/ChatterMessage.java @@ -0,0 +1,38 @@ +package seng302.server.messages; + +/** + * Created by kre39 on 20/07/17. + */ +public class ChatterMessage extends Message { + + private final long MESSAGE_VERSION_NUMBER = 1; + private final int MESSAGE_SIZE = 3; + private int message_type; + private int message_size = 21; + private String message; + + public ChatterMessage(int message_type, int message_size, String message) { + this.message_type = message_type; + this.message_size = message_size; + this.message = message; + + setHeader(new Header(MessageType.CHATTER_TEXT, 1, (short) getSize())); + allocateBuffer(); + writeHeaderToBuffer(); + + putByte((byte) MESSAGE_VERSION_NUMBER); + putInt(message_type, 1); + putInt(message_size, 1); + putBytes(message.getBytes()); + + writeCRC(); + rewind(); + } + + @Override + public int getSize() { + return MESSAGE_SIZE + message_size; + } + + +} diff --git a/src/main/java/seng302/server/messages/Message.java b/src/main/java/seng302/server/messages/Message.java index 478ba962..398628ab 100644 --- a/src/main/java/seng302/server/messages/Message.java +++ b/src/main/java/seng302/server/messages/Message.java @@ -219,5 +219,4 @@ public abstract class Message { data[right] = (byte) (temp & 0xff); } } - }