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]
main
Connor Taylor-Brown 9 years ago
parent 9a76fa592c
commit cc264f318e

@ -4,6 +4,7 @@ import network.Messages.Enums.XMLMessageType;
import network.Messages.LatestMessages;
import network.Messages.XMLMessage;
import org.mockito.Mock;
import visualiser.gameController.ControllerServer;
import java.io.DataOutputStream;
import java.io.IOException;
@ -75,7 +76,9 @@ public class ConnectionAcceptor implements Runnable {
Socket mockSocket = serverSocket.accept();
DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream());
MockOutput mockOutput = new MockOutput(latestMessages, outToVisualiser);
ControllerServer controllerServer = new ControllerServer(mockSocket);
new Thread(mockOutput).start();
new Thread(controllerServer).start();
mockOutputList.add(mockOutput);
System.out.println(String.format("%d number of Visualisers Connected.", mockOutputList.size()));
} catch (IOException e) {

@ -94,7 +94,6 @@ public class Event {
MockRace newRace = new MockRace(boatDataSource, raceDataSource, regattaDataSource, this.latestMessages, this.boatPolars, Constants.RaceTimeScale);
new Thread(newRace).start();
}
/**

@ -53,7 +53,7 @@ public class ConnectionController extends Controller {
statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty());
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);
});
connectButton.setDisable(true);

@ -4,6 +4,7 @@ import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;
import visualiser.app.VisualiserInput;
import visualiser.gameController.ControllerClient;
import visualiser.model.VisualiserBoat;
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 visualiserRace The object modelling the race.
*/
public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace) {
raceController.startRace(visualiserInput, visualiserRace);
public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) {
raceController.startRace(visualiserInput, visualiserRace, controllerClient);
}
/**

@ -19,11 +19,13 @@ import javafx.util.Callback;
import network.Messages.Enums.RaceStatusEnum;
import shared.model.Leg;
import visualiser.app.VisualiserInput;
import visualiser.gameController.ControllerClient;
import visualiser.gameController.Keys.ControlKey;
import visualiser.gameController.Keys.KeyFactory;
import visualiser.model.*;
import java.awt.*;
import java.io.IOException;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ResourceBundle;
@ -58,6 +60,11 @@ public class RaceController extends Controller {
*/
private Sparkline sparkline;
/**
* Service for sending keystrokes to server
*/
private ControllerClient controllerClient;
@FXML private GridPane canvasBase;
@FXML private Pane arrow;
@ -90,7 +97,11 @@ public class RaceController extends Controller {
String codeString = event.getCode().toString();
ControlKey controlKey = KeyFactory.getKey(codeString);
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 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.visualiserRace = visualiserRace;
this.controllerClient = controllerClient;
initialiseRace();

@ -19,6 +19,7 @@ import shared.exceptions.InvalidRaceDataException;
import shared.exceptions.InvalidRegattaDataException;
import shared.exceptions.XMLReaderException;
import visualiser.app.VisualiserInput;
import visualiser.gameController.ControllerClient;
import visualiser.model.VisualiserBoat;
import visualiser.model.VisualiserRace;
@ -76,6 +77,8 @@ public class StartController extends Controller implements Observer {
*/
private VisualiserRace visualiserRace;
private ControllerClient controllerClient;
/**
* 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);
start.setVisible(false);
parent.beginRace(visualiserInput, visualiserRace);
parent.beginRace(visualiserInput, visualiserRace, controllerClient);
}
}
}.start();
@ -308,6 +311,8 @@ public class StartController extends Controller implements Observer {
try {
//Begin reading packets from the socket/server.
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.
LatestMessages latestMessages = this.visualiserInput.getLatestMessages();
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 {
/**
* 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)
* @return the Control Key behaviour of the key pressed.
*/

Loading…
Cancel
Save