packets can now be sent from client to match server

#story[1188]
main
hba56 8 years ago
parent b2bd4fdc1c
commit 83f756d7d8

@ -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();

@ -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);
}
}

@ -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(){

@ -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<RaceConnection> 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;
}
}

@ -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

@ -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;
}
}

Loading…
Cancel
Save