From 83f756d7d8210958a0956785d3010a1071d0e16e Mon Sep 17 00:00:00 2001 From: hba56 Date: Wed, 30 Aug 2017 15:26:54 +1200 Subject: [PATCH] packets can now be sent from client to match server #story[1188] --- .../networkInterface/NetworkInterface.java | 36 +++++++++--- .../src/main/java/mock/app/Event.java | 22 ++++---- .../Controllers/HostController.java | 26 ++++++--- .../Controllers/LobbyController.java | 7 ++- .../Controllers/MainController.java | 16 +++++- .../network/MatchBrowserInterface.java | 56 ++++++++++++++++++- 6 files changed, 130 insertions(+), 33 deletions(-) diff --git a/matchBrowser/src/main/java/networkInterface/NetworkInterface.java b/matchBrowser/src/main/java/networkInterface/NetworkInterface.java index e6bd69c1..34d67b71 100644 --- a/matchBrowser/src/main/java/networkInterface/NetworkInterface.java +++ b/matchBrowser/src/main/java/networkInterface/NetworkInterface.java @@ -1,7 +1,10 @@ package networkInterface; +import network.BinaryMessageDecoder; import network.Exceptions.InvalidMessageException; +import network.MessageDecoders.HostGameMessageDecoder; import network.MessageDecoders.HostedGamesRequestDecoder; +import network.Messages.HostGame; import network.Messages.HostGamesRequest; import java.io.IOException; @@ -34,16 +37,33 @@ public class NetworkInterface { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); - //decode and update table - HostedGamesRequestDecoder decoder = new HostedGamesRequestDecoder(); - HostGamesRequest newKnownGames; - try{ - newKnownGames = (HostGamesRequest) decoder.decode(receivePacket.getData()); - System.out.println(newKnownGames.getKnownGames().get(0)); - }catch (InvalidMessageException e){ - System.err.println("Message received that is not a hostedGamesRequest packet"); + BinaryMessageDecoder messageDecoder = new BinaryMessageDecoder(receivePacket.getData()); + switch (messageDecoder.getHeaderMessageType()){ + case 108: + //decode and update table + HostGameMessageDecoder decoder = new HostGameMessageDecoder(); + HostGame newKnownGame; + try{ + newKnownGame = (HostGame) decoder.decode(messageDecoder.getMessageBody()); + System.out.println(newKnownGame.getIp()); + }catch (InvalidMessageException e){ + System.err.println("Message received that is not a hostedGame packet"); + } + break; + case 109: + //decode and update table + HostedGamesRequestDecoder decoder2 = new HostedGamesRequestDecoder(); + HostGamesRequest newKnownGames; + try{ + newKnownGames = (HostGamesRequest) decoder2.decode(receivePacket.getData()); + System.out.println(newKnownGames); + }catch (InvalidMessageException e){ + System.err.println("Message received that is not a hostedGamesRequest packet"); + } + break; } + //client ip and port InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index c054e2fb..65c34247 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -4,9 +4,9 @@ import mock.dataInput.PolarParser; import mock.exceptions.EventConstructionException; import mock.model.*; import mock.model.commandFactory.CompositeCommand; -import mock.xml.RaceXMLCreator; +import network.Messages.Enums.RaceStatusEnum; +import network.Messages.HostGame; import network.Messages.LatestMessages; -import org.xml.sax.SAXException; import shared.dataInput.*; import shared.enums.XMLFileType; import shared.exceptions.InvalidBoatDataException; @@ -16,18 +16,11 @@ import shared.exceptions.XMLReaderException; import shared.model.Bearing; import shared.model.Constants; -import javax.xml.bind.JAXBException; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.TransformerException; import java.io.IOException; -import java.net.UnknownHostException; +import java.net.InetAddress; import java.nio.charset.StandardCharsets; -import java.time.Duration; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; /** @@ -208,4 +201,13 @@ public class Event { return raceXML; } + /** + * Creates the needed data type for a network packet + * @return hostGame Ac35DataType + */ + public HostGame getHostedGameData() throws IOException{ + InetAddress ip = InetAddress.getByName("localhost"); + return new HostGame(ip.getHostAddress(), 3779,(byte) 1,(byte) 1, RaceStatusEnum.PRESTART, (byte) 1, (byte) 1); + } + } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index 1609e700..66d51f59 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -4,16 +4,11 @@ import javafx.fxml.FXML; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; import mock.app.Event; -import org.xml.sax.SAXException; import mock.exceptions.EventConstructionException; -import shared.exceptions.InvalidBoatDataException; -import shared.exceptions.InvalidRaceDataException; -import shared.exceptions.InvalidRegattaDataException; -import shared.exceptions.XMLReaderException; +import visualiser.network.MatchBrowserInterface; -import javax.xml.bind.JAXBException; -import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.net.DatagramSocket; import java.net.Socket; import java.net.URL; import java.util.ResourceBundle; @@ -36,6 +31,7 @@ public class HostController extends Controller { AnchorPane hostWrapper; private Event game; + private DatagramSocket udpSocket; @Override @@ -50,12 +46,25 @@ public class HostController extends Controller { try { this.game = new Event(false); connectSocket("localhost", 4942); + alertMatchBrowser(); } catch (EventConstructionException e) { Logger.getGlobal().log(Level.SEVERE, "Could not create Event.", e); throw new RuntimeException(e); } } + /** + * Sends info to the match browser so clients can see it + */ + public void alertMatchBrowser(){ + MatchBrowserInterface matchBrowserInterface = new MatchBrowserInterface(); + try{ + matchBrowserInterface.sendOutGameInfo(this.game.getHostedGameData(), udpSocket); + }catch (IOException e){ + System.err.println("failed to send out hosted game info"); + } + } + public void endEvent() throws IOException { game.endEvent(); } @@ -80,8 +89,9 @@ public class HostController extends Controller { /** * Hosts a game. */ - public void hostGame(){ + public void hostGame(DatagramSocket udpSocket){ hostWrapper.setVisible(true); + this.udpSocket = udpSocket; } public void menuBtnPressed(){ diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index 07af2b49..87206589 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -11,6 +11,7 @@ import javafx.scene.layout.AnchorPane; import visualiser.model.RaceConnection; import java.io.IOException; +import java.net.DatagramSocket; import java.net.Socket; import java.net.URL; import java.util.ResourceBundle; @@ -39,6 +40,9 @@ public class LobbyController extends Controller { private ObservableList connections; + //the socket for match browser + private DatagramSocket udpSocket; + @Override public void initialize(URL location, ResourceBundle resources) { @@ -120,7 +124,8 @@ public class LobbyController extends Controller { /** * Enter the lobby page. */ - public void enterLobby(){ + public void enterLobby(DatagramSocket udpSocket){ lobbyWrapper.setVisible(true); + this.udpSocket = udpSocket; } } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java index 57d18830..e4153a94 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java @@ -3,12 +3,13 @@ package visualiser.Controllers; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.layout.AnchorPane; -import visualiser.app.App; import visualiser.gameController.ControllerClient; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRaceEvent; +import visualiser.network.MatchBrowserInterface; import java.io.IOException; +import java.net.DatagramSocket; import java.net.Socket; import java.net.URL; import java.util.ResourceBundle; @@ -27,11 +28,20 @@ public class MainController extends Controller { @FXML private HostController hostController; @FXML private LobbyController lobbyController; + private MatchBrowserInterface matchBrowserInterface; + private DatagramSocket udpSocket; + /** * Ctor. */ public MainController() { + this.matchBrowserInterface = new MatchBrowserInterface(); + try{ + this.udpSocket = matchBrowserInterface.setupMatchBowserConnection(); + }catch (IOException e){ + System.err.println("Error in setting up connection with match browser"); + } } @@ -74,12 +84,12 @@ public class MainController extends Controller { /** * Transitions into lobby screen */ - public void enterLobby(){ lobbyController.enterLobby(); } + public void enterLobby(){ lobbyController.enterLobby(udpSocket); } /** * Transitions into host game screen */ - public void hostGame(){ hostController.hostGame(); } + public void hostGame(){ hostController.hostGame(udpSocket); } /** * Sets up the css for the start of the program diff --git a/racevisionGame/src/main/java/visualiser/network/MatchBrowserInterface.java b/racevisionGame/src/main/java/visualiser/network/MatchBrowserInterface.java index f5d806ed..95ce8b18 100644 --- a/racevisionGame/src/main/java/visualiser/network/MatchBrowserInterface.java +++ b/racevisionGame/src/main/java/visualiser/network/MatchBrowserInterface.java @@ -3,31 +3,81 @@ package visualiser.network; import network.BinaryMessageEncoder; import network.Exceptions.InvalidMessageException; import network.MessageEncoders.HostGameMessageEncoder; +import network.MessageEncoders.HostedGamesRequestEncoder; import network.Messages.AC35Data; import network.Messages.Enums.MessageType; +import network.Messages.HostGamesRequest; +import java.io.IOException; +import java.net.DatagramPacket; import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; /** * UDP interface for the matchBrowser to send out hosted game info and get in other hosts info */ public class MatchBrowserInterface { - DatagramSocket clientSocket; + //ip of the server + private InetAddress IPAddress; + //port server is hosted on + private int port; - public void sendOutGameInfo(AC35Data gameInfo){ + + + public MatchBrowserInterface() { + //TODO change to ip of cloud server hosting this + try { + this.IPAddress = InetAddress.getByName("localhost"); + } catch (UnknownHostException e) { + } + this.port = 3779; + } + + /** + * Used by host to send out race information to the server + * @param gameInfo the hostGame info for message + * @param socket the udp socket assigned on startup + */ + public void sendOutGameInfo(AC35Data gameInfo, DatagramSocket socket) throws IOException{ byte[] fullMessageToSend; try{ HostGameMessageEncoder encoder = new HostGameMessageEncoder(); byte[] message = encoder.encode(gameInfo); BinaryMessageEncoder messageEncoder = new BinaryMessageEncoder(MessageType.HOST_GAME - ,System.currentTimeMillis(), 1,(short) 14 ,message); + ,System.currentTimeMillis(), 1,(short) 13 ,message); fullMessageToSend = messageEncoder.getFullMessage(); + + DatagramPacket sendPacket = new DatagramPacket(fullMessageToSend, fullMessageToSend.length, IPAddress, port); + socket.send(sendPacket); + }catch (InvalidMessageException e){ System.err.println("HostGameMessage could not be encoded"); } + } + /** + * Used by a client to setup a connection with the match browser server + * @return the socket created for this connection + */ + public DatagramSocket setupMatchBowserConnection() throws IOException{ + DatagramSocket clientSocket = new DatagramSocket(); + //creates and empty hostedGamesRequest packet that can be sent to the server + //this lets the server check the udp fields for ip and port to know that this client exists + try{ + HostedGamesRequestEncoder encoder = new HostedGamesRequestEncoder(); + byte[] message = encoder.encode(new HostGamesRequest(new ArrayList())); + BinaryMessageEncoder messageEncoder = new BinaryMessageEncoder(MessageType.HOSTED_GAMES_REQUEST + ,System.currentTimeMillis(), 1,(short) 13 ,message); + DatagramPacket sendPacket = new DatagramPacket(messageEncoder.getFullMessage(), messageEncoder.getFullMessage().length, IPAddress, port); + clientSocket.send(sendPacket); + }catch (InvalidMessageException e){ + System.err.println("HostedGamesRequestMessage could not be encoded"); + } + return clientSocket; } }