Added ControllerClient and ControllerServer
- StartController sets up client-wide ControllerClient on socket to game server. - RaceController now calls ControllerClient.sendKey with each keypress - ConnectionAcceptor runs ControllerServer for each successfully connected client #story[1089]
This commit is contained in:
@@ -4,6 +4,7 @@ import network.Messages.Enums.XMLMessageType;
|
|||||||
import network.Messages.LatestMessages;
|
import network.Messages.LatestMessages;
|
||||||
import network.Messages.XMLMessage;
|
import network.Messages.XMLMessage;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
|
import visualiser.gameController.ControllerServer;
|
||||||
|
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -75,7 +76,9 @@ public class ConnectionAcceptor implements Runnable {
|
|||||||
Socket mockSocket = serverSocket.accept();
|
Socket mockSocket = serverSocket.accept();
|
||||||
DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream());
|
DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream());
|
||||||
MockOutput mockOutput = new MockOutput(latestMessages, outToVisualiser);
|
MockOutput mockOutput = new MockOutput(latestMessages, outToVisualiser);
|
||||||
|
ControllerServer controllerServer = new ControllerServer(mockSocket);
|
||||||
new Thread(mockOutput).start();
|
new Thread(mockOutput).start();
|
||||||
|
new Thread(controllerServer).start();
|
||||||
mockOutputList.add(mockOutput);
|
mockOutputList.add(mockOutput);
|
||||||
System.out.println(String.format("%d number of Visualisers Connected.", mockOutputList.size()));
|
System.out.println(String.format("%d number of Visualisers Connected.", mockOutputList.size()));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ public class Event {
|
|||||||
MockRace newRace = new MockRace(boatDataSource, raceDataSource, regattaDataSource, this.latestMessages, this.boatPolars, Constants.RaceTimeScale);
|
MockRace newRace = new MockRace(boatDataSource, raceDataSource, regattaDataSource, this.latestMessages, this.boatPolars, Constants.RaceTimeScale);
|
||||||
|
|
||||||
new Thread(newRace).start();
|
new Thread(newRace).start();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public class ConnectionController extends Controller {
|
|||||||
statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty());
|
statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty());
|
||||||
|
|
||||||
connectionTable.getSelectionModel().selectedItemProperty().addListener((obs, prev, curr) -> {
|
connectionTable.getSelectionModel().selectedItemProperty().addListener((obs, prev, curr) -> {
|
||||||
if (curr != null && ((RaceConnection)curr).check()) connectButton.setDisable(false);
|
if (curr != null && curr.check()) connectButton.setDisable(false);
|
||||||
else connectButton.setDisable(true);
|
else connectButton.setDisable(true);
|
||||||
});
|
});
|
||||||
connectButton.setDisable(true);
|
connectButton.setDisable(true);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import javafx.collections.ObservableList;
|
|||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.scene.layout.AnchorPane;
|
import javafx.scene.layout.AnchorPane;
|
||||||
import visualiser.app.VisualiserInput;
|
import visualiser.app.VisualiserInput;
|
||||||
|
import visualiser.gameController.ControllerClient;
|
||||||
import visualiser.model.VisualiserBoat;
|
import visualiser.model.VisualiserBoat;
|
||||||
import visualiser.model.VisualiserRace;
|
import visualiser.model.VisualiserRace;
|
||||||
|
|
||||||
@@ -36,8 +37,8 @@ public class MainController extends Controller {
|
|||||||
* @param visualiserInput The object used to read packets from the race server.
|
* @param visualiserInput The object used to read packets from the race server.
|
||||||
* @param visualiserRace The object modelling the race.
|
* @param visualiserRace The object modelling the race.
|
||||||
*/
|
*/
|
||||||
public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace) {
|
public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) {
|
||||||
raceController.startRace(visualiserInput, visualiserRace);
|
raceController.startRace(visualiserInput, visualiserRace, controllerClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -19,11 +19,13 @@ import javafx.util.Callback;
|
|||||||
import network.Messages.Enums.RaceStatusEnum;
|
import network.Messages.Enums.RaceStatusEnum;
|
||||||
import shared.model.Leg;
|
import shared.model.Leg;
|
||||||
import visualiser.app.VisualiserInput;
|
import visualiser.app.VisualiserInput;
|
||||||
|
import visualiser.gameController.ControllerClient;
|
||||||
import visualiser.gameController.Keys.ControlKey;
|
import visualiser.gameController.Keys.ControlKey;
|
||||||
import visualiser.gameController.Keys.KeyFactory;
|
import visualiser.gameController.Keys.KeyFactory;
|
||||||
import visualiser.model.*;
|
import visualiser.model.*;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
@@ -58,6 +60,11 @@ public class RaceController extends Controller {
|
|||||||
*/
|
*/
|
||||||
private Sparkline sparkline;
|
private Sparkline sparkline;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service for sending keystrokes to server
|
||||||
|
*/
|
||||||
|
private ControllerClient controllerClient;
|
||||||
|
|
||||||
|
|
||||||
@FXML private GridPane canvasBase;
|
@FXML private GridPane canvasBase;
|
||||||
@FXML private Pane arrow;
|
@FXML private Pane arrow;
|
||||||
@@ -90,7 +97,11 @@ public class RaceController extends Controller {
|
|||||||
String codeString = event.getCode().toString();
|
String codeString = event.getCode().toString();
|
||||||
ControlKey controlKey = KeyFactory.getKey(codeString);
|
ControlKey controlKey = KeyFactory.getKey(codeString);
|
||||||
if(controlKey != null) {
|
if(controlKey != null) {
|
||||||
System.out.println(controlKey.toString() + " is Pressed.");
|
try {
|
||||||
|
controllerClient.sendKey(controlKey);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -324,10 +335,11 @@ public class RaceController extends Controller {
|
|||||||
* @param visualiserInput Object used to read packets from server.
|
* @param visualiserInput Object used to read packets from server.
|
||||||
* @param visualiserRace Object modelling the race.
|
* @param visualiserRace Object modelling the race.
|
||||||
*/
|
*/
|
||||||
public void startRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace) {
|
public void startRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) {
|
||||||
|
|
||||||
this.visualiserInput = visualiserInput;
|
this.visualiserInput = visualiserInput;
|
||||||
this.visualiserRace = visualiserRace;
|
this.visualiserRace = visualiserRace;
|
||||||
|
this.controllerClient = controllerClient;
|
||||||
|
|
||||||
initialiseRace();
|
initialiseRace();
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import shared.exceptions.InvalidRaceDataException;
|
|||||||
import shared.exceptions.InvalidRegattaDataException;
|
import shared.exceptions.InvalidRegattaDataException;
|
||||||
import shared.exceptions.XMLReaderException;
|
import shared.exceptions.XMLReaderException;
|
||||||
import visualiser.app.VisualiserInput;
|
import visualiser.app.VisualiserInput;
|
||||||
|
import visualiser.gameController.ControllerClient;
|
||||||
import visualiser.model.VisualiserBoat;
|
import visualiser.model.VisualiserBoat;
|
||||||
import visualiser.model.VisualiserRace;
|
import visualiser.model.VisualiserRace;
|
||||||
|
|
||||||
@@ -76,6 +77,8 @@ public class StartController extends Controller implements Observer {
|
|||||||
*/
|
*/
|
||||||
private VisualiserRace visualiserRace;
|
private VisualiserRace visualiserRace;
|
||||||
|
|
||||||
|
private ControllerClient controllerClient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An array of colors used to assign colors to each boat - passed in to the VisualiserRace constructor.
|
* An array of colors used to assign colors to each boat - passed in to the VisualiserRace constructor.
|
||||||
*/
|
*/
|
||||||
@@ -258,7 +261,7 @@ public class StartController extends Controller implements Observer {
|
|||||||
startWrapper.setVisible(false);
|
startWrapper.setVisible(false);
|
||||||
start.setVisible(false);
|
start.setVisible(false);
|
||||||
|
|
||||||
parent.beginRace(visualiserInput, visualiserRace);
|
parent.beginRace(visualiserInput, visualiserRace, controllerClient);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.start();
|
}.start();
|
||||||
@@ -308,6 +311,8 @@ public class StartController extends Controller implements Observer {
|
|||||||
try {
|
try {
|
||||||
//Begin reading packets from the socket/server.
|
//Begin reading packets from the socket/server.
|
||||||
this.visualiserInput = new VisualiserInput(socket);
|
this.visualiserInput = new VisualiserInput(socket);
|
||||||
|
//Send controller input to server
|
||||||
|
this.controllerClient = new ControllerClient(socket);
|
||||||
//Store a reference to latestMessages so that we can observe it.
|
//Store a reference to latestMessages so that we can observe it.
|
||||||
LatestMessages latestMessages = this.visualiserInput.getLatestMessages();
|
LatestMessages latestMessages = this.visualiserInput.getLatestMessages();
|
||||||
latestMessages.addObserver(this);
|
latestMessages.addObserver(this);
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package visualiser.gameController;
|
||||||
|
|
||||||
|
import visualiser.gameController.Keys.ControlKey;
|
||||||
|
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basic service for sending key presses to game server
|
||||||
|
*/
|
||||||
|
public class ControllerClient {
|
||||||
|
/**
|
||||||
|
* Socket to server
|
||||||
|
*/
|
||||||
|
Socket socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Output stream wrapper for socket to server
|
||||||
|
*/
|
||||||
|
DataOutputStream outputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise controller client with live socket.
|
||||||
|
* @param socket to server
|
||||||
|
*/
|
||||||
|
public ControllerClient(Socket socket) {
|
||||||
|
this.socket = socket;
|
||||||
|
try {
|
||||||
|
this.outputStream = new DataOutputStream(socket.getOutputStream());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a keypress to server
|
||||||
|
* @param key to send
|
||||||
|
* @throws IOException if socket write fails
|
||||||
|
*/
|
||||||
|
public void sendKey(ControlKey key) throws IOException {
|
||||||
|
// TODO - get and send action number currently corresponding to key (context dependent)
|
||||||
|
System.out.println(key.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package visualiser.gameController;
|
||||||
|
|
||||||
|
import visualiser.gameController.Keys.ControlKey;
|
||||||
|
import visualiser.gameController.Keys.KeyFactory;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service for dispatching key press data to race from client
|
||||||
|
*/
|
||||||
|
public class ControllerServer implements Runnable {
|
||||||
|
/**
|
||||||
|
* Socket to client
|
||||||
|
*/
|
||||||
|
private Socket socket;
|
||||||
|
/**
|
||||||
|
* Wrapper for input from client
|
||||||
|
*/
|
||||||
|
private DataInputStream inputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise server-side controller with live client socket
|
||||||
|
* @param socket to client
|
||||||
|
*/
|
||||||
|
public ControllerServer(Socket socket) {
|
||||||
|
this.socket = socket;
|
||||||
|
try {
|
||||||
|
this.inputStream = new DataInputStream(this.socket.getInputStream());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait for controller key input from client and loop.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while(true) {
|
||||||
|
byte[] key = new byte[1];
|
||||||
|
try {
|
||||||
|
inputStream.read(key);
|
||||||
|
// TODO - handle messages received
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import javafx.scene.input.KeyCode;
|
|||||||
public class KeyFactory {
|
public class KeyFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the Control Key incharge of a key press
|
* Get the Control Key in charge of a key press
|
||||||
* @param key key pressed (String value of KeyCode)
|
* @param key key pressed (String value of KeyCode)
|
||||||
* @return the Control Key behaviour of the key pressed.
|
* @return the Control Key behaviour of the key pressed.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user