Merge remote-tracking branch 'origin/develop' into develop

This commit is contained in:
Michael Rausch
2017-08-02 20:32:43 +12:00
21 changed files with 108 additions and 334 deletions
+2 -2
View File
@@ -7,8 +7,8 @@ import javafx.scene.Scene;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.stage.Stage; import javafx.stage.Stage;
import seng302.client.ClientPacketParser; import seng302.client.ClientPacketParser;
import seng302.client.ClientState;
import seng302.models.PolarTable; import seng302.models.PolarTable;
import seng302.models.stream.StreamReceiver;
public class App extends Application { public class App extends Application {
@@ -27,10 +27,10 @@ public class App extends Application {
primaryStage.show(); primaryStage.show();
primaryStage.setOnCloseRequest(e -> { primaryStage.setOnCloseRequest(e -> {
ClientPacketParser.appClose(); ClientPacketParser.appClose();
StreamReceiver.noMoreBytes();
System.exit(0); System.exit(0);
}); });
ClientState.primaryStage = primaryStage;
} }
public static void main(String[] args) { public static void main(String[] args) {
@@ -108,7 +108,6 @@ public class ClientPacketParser {
} }
} catch (NullPointerException e) { } catch (NullPointerException e) {
System.out.println("Error parsing packet"); System.out.println("Error parsing packet");
// e.printStackTrace();
} }
} }
@@ -287,7 +286,7 @@ public class ClientPacketParser {
db = dbf.newDocumentBuilder(); db = dbf.newDocumentBuilder();
doc = db.parse(new InputSource(new StringReader(xmlMessage))); doc = db.parse(new InputSource(new StringReader(xmlMessage)));
} catch (ParserConfigurationException | IOException | SAXException e) { } catch (ParserConfigurationException | IOException | SAXException e) {
e.printStackTrace(); System.out.println("[ClientPacketParser] ParserConfigurationException | IOException | SAXException");
} }
xmlObject.constructXML(doc, messageType); xmlObject.constructXML(doc, messageType);
@@ -2,6 +2,7 @@ package seng302.client;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import javafx.stage.Stage;
import seng302.models.Yacht; import seng302.models.Yacht;
/** /**
@@ -17,6 +18,7 @@ public class ClientState {
private static Map<Integer, Yacht> boats = new ConcurrentHashMap<>(); private static Map<Integer, Yacht> boats = new ConcurrentHashMap<>();
private static Boolean boatsUpdated = true; private static Boolean boatsUpdated = true;
private static String clientSourceId = ""; private static String clientSourceId = "";
public static Stage primaryStage;
public static String getHostIp() { public static String getHostIp() {
return hostIp; return hostIp;
@@ -26,7 +26,7 @@ public class ClientStateQueryingRunnable extends Observable implements Runnable
try { try {
Thread.sleep(0); Thread.sleep(0);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); continue;
} }
if (ClientState.isRaceStarted() && ClientState.isConnectedToHost()) { if (ClientState.isRaceStarted() && ClientState.isConnectedToHost()) {
@@ -10,6 +10,9 @@ import java.time.LocalDateTime;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import java.util.zip.Checksum; import java.util.zip.Checksum;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import seng302.models.stream.packets.StreamPacket; import seng302.models.stream.packets.StreamPacket;
import seng302.server.messages.BoatActionMessage; import seng302.server.messages.BoatActionMessage;
import seng302.server.messages.Message; import seng302.server.messages.Message;
@@ -42,9 +45,10 @@ public class ClientToServerThread implements Runnable {
* *
* @param ipAddress a string of ip address to be connected to * @param ipAddress a string of ip address to be connected to
* @param portNumber an integer port number * @param portNumber an integer port number
* @throws Exception SocketConnection if fail to connect to ip address and port number combination * @throws Exception SocketConnection if fail to connect to ip address and port number
* combination
*/ */
public ClientToServerThread(String ipAddress, Integer portNumber) throws Exception{ public ClientToServerThread(String ipAddress, Integer portNumber) throws Exception {
socket = new Socket(ipAddress, portNumber); socket = new Socket(ipAddress, portNumber);
is = socket.getInputStream(); is = socket.getInputStream();
os = socket.getOutputStream(); os = socket.getOutputStream();
@@ -71,9 +75,10 @@ public class ClientToServerThread implements Runnable {
* @param message a string of message to be printed out * @param message a string of message to be printed out
* @param logLevel an int for log level * @param logLevel an int for log level
*/ */
static void clientLog(String message, int logLevel){ static void clientLog(String message, int logLevel) {
if(logLevel <= LOG_LEVEL){ if (logLevel <= LOG_LEVEL) {
System.out.println("[CLIENT " + LocalDateTime.now().toLocalTime().toString() + "] " + message); System.out.println(
"[CLIENT " + LocalDateTime.now().toLocalTime().toString() + "] " + message);
} }
} }
@@ -85,13 +90,13 @@ public class ClientToServerThread implements Runnable {
int sync1; int sync1;
int sync2; int sync2;
// TODO: 14/07/17 wmu16 - Work out how to fix this while loop // TODO: 14/07/17 wmu16 - Work out how to fix this while loop
while(ClientState.isConnectedToHost()) { while (ClientState.isConnectedToHost()) {
try { try {
crcBuffer = new ByteArrayOutputStream(); crcBuffer = new ByteArrayOutputStream();
sync1 = readByte(); sync1 = readByte();
sync2 = readByte(); sync2 = readByte();
//checking if it is the start of the packet //checking if it is the start of the packet
if(sync1 == 0x47 && sync2 == 0x83) { if (sync1 == 0x47 && sync2 == 0x83) {
int type = readByte(); int type = readByte();
//No. of milliseconds since Jan 1st 1970 //No. of milliseconds since Jan 1st 1970
long timeStamp = Message.bytesToLong(getBytes(6)); long timeStamp = Message.bytesToLong(getBytes(6));
@@ -111,6 +116,15 @@ public class ClientToServerThread implements Runnable {
} }
} catch (Exception e) { } catch (Exception e) {
closeSocket(); closeSocket();
Platform.runLater(new Runnable() {
@Override
public void run() {
Alert alert = new Alert(AlertType.ERROR);
alert.setHeaderText("Host has disconnected");
alert.setContentText("Cannot find Server");
alert.showAndWait();
}
});
clientLog("Disconnected from server", 1); clientLog("Disconnected from server", 1);
return; return;
} }
@@ -122,6 +136,7 @@ public class ClientToServerThread implements Runnable {
/** /**
* Listens for an allocated sourceID and returns it to the server * Listens for an allocated sourceID and returns it to the server
*
* @return the sourceID allocated to us by the server * @return the sourceID allocated to us by the server
*/ */
private Integer threeWayHandshake() { private Integer threeWayHandshake() {
@@ -146,7 +161,6 @@ public class ClientToServerThread implements Runnable {
} }
/** /**
* Send the post-start race course information * Send the post-start race course information
*/ */
@@ -176,22 +190,22 @@ public class ClientToServerThread implements Runnable {
} catch (IOException e) { } catch (IOException e) {
clientLog("Read byte failed", 1); clientLog("Read byte failed", 1);
} }
if (currentByte == -1){ if (currentByte == -1) {
throw new Exception(); throw new Exception();
} }
return currentByte; return currentByte;
} }
private byte[] getBytes(int n) throws Exception{ private byte[] getBytes(int n) throws Exception {
byte[] bytes = new byte[n]; byte[] bytes = new byte[n];
for (int i = 0; i < n; i++){ for (int i = 0; i < n; i++) {
bytes[i] = (byte) readByte(); bytes[i] = (byte) readByte();
} }
return bytes; return bytes;
} }
private void skipBytes(long n) throws Exception{ private void skipBytes(long n) throws Exception {
for (int i=0; i < n; i++){ for (int i = 0; i < n; i++) {
readByte(); readByte();
} }
} }
@@ -181,9 +181,9 @@ public class CanvasController {
contentPane.getChildren().addAll( contentPane.getChildren().addAll(
(Pane) FXMLLoader.load(getClass().getResource("/views/FinishScreenView.fxml"))); (Pane) FXMLLoader.load(getClass().getResource("/views/FinishScreenView.fxml")));
} catch (javafx.fxml.LoadException e) { } catch (javafx.fxml.LoadException e) {
e.printStackTrace(); System.out.println("[Controller] FXML load exception");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); System.out.println("[Controller] IO exception");
} }
} }
@@ -282,9 +282,8 @@ public class CanvasController {
p2d.getX(), p2d.getY(), heading, positionPacket.getGroundSpeed(), p2d.getX(), p2d.getY(), heading, positionPacket.getGroundSpeed(),
positionPacket.getTimeValid(), frameRate); positionPacket.getTimeValid(), frameRate);
} catch (InterruptedException e){ } catch (InterruptedException e){
e.printStackTrace(); System.out.println("[CanvasController] Interrupted Exception");
} }
// }
} }
} }
@@ -297,7 +296,7 @@ public class CanvasController {
Point2D p2d = findScaledXY(positionPacket.getLat(), positionPacket.getLon()); Point2D p2d = findScaledXY(positionPacket.getLat(), positionPacket.getLon());
markGroup.moveMarkTo(p2d.getX(), p2d.getY(), raceId); markGroup.moveMarkTo(p2d.getX(), p2d.getY(), raceId);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); System.out.println("[CanvasController] Interrupted exception");
} }
} }
} }
@@ -10,6 +10,7 @@ import javafx.scene.Parent;
import javafx.scene.input.KeyEvent; import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import seng302.client.ClientPacketParser; import seng302.client.ClientPacketParser;
import seng302.client.ClientState;
import seng302.client.ClientToServerThread; import seng302.client.ClientToServerThread;
import seng302.server.messages.BoatActionMessage; import seng302.server.messages.BoatActionMessage;
import seng302.server.messages.BoatActionType; import seng302.server.messages.BoatActionType;
@@ -22,7 +23,7 @@ public class Controller implements Initializable {
private long lastSendingTime; private long lastSendingTime;
private int KEY_STROKE_SENDING_FREQUENCY = 50; private int KEY_STROKE_SENDING_FREQUENCY = 50;
private Object setContentPane(String jfxUrl) { public Object setContentPane(String jfxUrl) {
try { try {
contentPane.getChildren().removeAll(); contentPane.getChildren().removeAll();
contentPane.getChildren().clear(); contentPane.getChildren().clear();
@@ -41,19 +42,25 @@ public class Controller implements Initializable {
@Override @Override
public void initialize(URL location, ResourceBundle resources) { public void initialize(URL location, ResourceBundle resources) {
setUpStartScreen();
lastSendingTime = System.currentTimeMillis();
}
void setUpStartScreen() {
contentPane.getChildren().removeAll();
contentPane.getChildren().clear();
contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString()); contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString());
StartScreenController startScreenController = (StartScreenController) setContentPane("/views/StartScreenView.fxml"); StartScreenController startScreenController = (StartScreenController) setContentPane("/views/StartScreenView.fxml");
startScreenController.setController(this); startScreenController.setController(this);
ClientPacketParser.boatLocations.clear(); ClientPacketParser.boatLocations.clear();
lastSendingTime = System.currentTimeMillis();
} }
/** Handle the key-pressed event from the text field. */ /** Handle the key-pressed event from the text field. */
public void keyPressed(KeyEvent e) { public void keyPressed(KeyEvent e) {
BoatActionMessage boatActionMessage; BoatActionMessage boatActionMessage;
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
if (currentTime - lastSendingTime > KEY_STROKE_SENDING_FREQUENCY) { if (currentTime - lastSendingTime > KEY_STROKE_SENDING_FREQUENCY && ClientState.isRaceStarted()) {
lastSendingTime = currentTime; lastSendingTime = currentTime;
switch (e.getCode()) { switch (e.getCode()) {
case SPACE: // align with vmg case SPACE: // align with vmg
@@ -85,9 +85,9 @@ public class FinishScreenViewController implements Initializable {
contentPane.getChildren() contentPane.getChildren()
.addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl))); .addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl)));
} catch (javafx.fxml.LoadException e) { } catch (javafx.fxml.LoadException e) {
e.printStackTrace(); System.out.println("[Controller] FXML load exception");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); System.out.println("[Controller] IO exception");
} }
} }
@@ -85,6 +85,7 @@ public class LobbyController implements Initializable, Observer{
private Boolean switchedPane = false; private Boolean switchedPane = false;
private MainServerThread mainServerThread; private MainServerThread mainServerThread;
private Controller controller;
private void setContentPane(String jfxUrl) { private void setContentPane(String jfxUrl) {
try { try {
@@ -95,9 +96,11 @@ public class LobbyController implements Initializable, Observer{
contentPane.getChildren() contentPane.getChildren()
.addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl))); .addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl)));
} catch (javafx.fxml.LoadException e) { } catch (javafx.fxml.LoadException e) {
e.printStackTrace(); System.out.println("[Controller] FXML load exception");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); System.out.println("[Controller] IO exception");
} catch (NullPointerException e) {
// System.out.println("[Controller] Null Pointer Exception");
} }
} }
@@ -108,7 +111,7 @@ public class LobbyController implements Initializable, Observer{
readyButton.setDisable(false); readyButton.setDisable(false);
} }
else { else {
lobbyIpText.setText("Connected to IP: "); lobbyIpText.setText("Connected to IP: " + ClientState.getHostIp());
readyButton.setDisable(true); readyButton.setDisable(true);
} }
@@ -200,11 +203,12 @@ public class LobbyController implements Initializable, Observer{
@FXML @FXML
public void leaveLobbyButtonPressed() { public void leaveLobbyButtonPressed() {
// TODO: 10/07/17 wmu16 - Finish function! if (ClientState.isHost()) {
setContentPane("/views/StartScreenView.fxml");
GameState.setCurrentStage(GameStages.CANCELLED); GameState.setCurrentStage(GameStages.CANCELLED);
// TODO: 20/07/17 wmu16 - Implement some way of terminating the game mainServerThread.terminate();
}
ClientState.setConnectedToHost(false); ClientState.setConnectedToHost(false);
controller.setUpStartScreen();
} }
@FXML @FXML
@@ -224,4 +228,8 @@ public class LobbyController implements Initializable, Observer{
public void setMainServerThread(MainServerThread mainServerThread) { public void setMainServerThread(MainServerThread mainServerThread) {
this.mainServerThread = mainServerThread; this.mainServerThread = mainServerThread;
} }
public void setController(Controller controller) {
this.controller = controller;
}
} }
@@ -145,7 +145,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
controller.loadState(importantAnnotations); controller.loadState(importantAnnotations);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); System.out.println("[RaceViewController] IO exception");
} }
} }
@@ -51,9 +51,9 @@ public class StartScreenController {
return fxmlLoader.getController(); return fxmlLoader.getController();
} catch (javafx.fxml.LoadException e) { } catch (javafx.fxml.LoadException e) {
e.printStackTrace(); System.out.println("[Controller] FXML load exception");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); System.out.println("[Controller] IO exception");
} }
return null; return null;
} }
@@ -81,12 +81,12 @@ public class StartScreenController {
controller.setClientToServerThread(clientToServerThread); controller.setClientToServerThread(clientToServerThread);
LobbyController lobbyController = (LobbyController) setContentPane("/views/LobbyView.fxml"); LobbyController lobbyController = (LobbyController) setContentPane("/views/LobbyView.fxml");
lobbyController.setMainServerThread(mainServerThread); lobbyController.setMainServerThread(mainServerThread);
lobbyController.setController(controller);
} catch (Exception e) { } catch (Exception e) {
Alert alert = new Alert(AlertType.ERROR); Alert alert = new Alert(AlertType.ERROR);
alert.setHeaderText("Cannot host"); alert.setHeaderText("Cannot host");
alert.setContentText("Oops, failed to host, try to restart."); alert.setContentText("Oops, failed to host, try to restart.");
alert.showAndWait(); alert.showAndWait();
e.printStackTrace();
} }
@@ -109,8 +109,10 @@ public class StartScreenController {
ClientState.setHost(false); ClientState.setHost(false);
ClientState.setConnectedToHost(true); ClientState.setConnectedToHost(true);
ClientState.setHostIp(ipAddress);
controller.setClientToServerThread(clientToServerThread); controller.setClientToServerThread(clientToServerThread);
setContentPane("/views/LobbyView.fxml"); LobbyController lobbyController = (LobbyController) setContentPane("/views/LobbyView.fxml");
lobbyController.setController(controller);
} catch (Exception e) { } catch (Exception e) {
Alert alert = new Alert(AlertType.ERROR); Alert alert = new Alert(AlertType.ERROR);
alert.setHeaderText("Cannot reach the host"); alert.setHeaderText("Cannot reach the host");
@@ -151,7 +153,7 @@ public class StartScreenController {
} }
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); System.out.println("[StartScreenController] Exception");
} }
if (ipAddress == null) { if (ipAddress == null) {
System.out.println("[HOST] Cannot obtain local host ip address."); System.out.println("[HOST] Cannot obtain local host ip address.");
+12 -12
View File
@@ -33,10 +33,6 @@ public class GameState implements Runnable {
public GameState(String hostIpAddress) { public GameState(String hostIpAddress) {
windDirection = 180d; windDirection = 180d;
windSpeed = 10000d; windSpeed = 10000d;
yachts = new HashMap<>();
players = new ArrayList<>();
this.hostIpAddress = hostIpAddress; this.hostIpAddress = hostIpAddress;
players = new ArrayList<>(); players = new ArrayList<>();
currentStage = GameStages.LOBBYING; currentStage = GameStages.LOBBYING;
@@ -140,13 +136,7 @@ public class GameState implements Runnable {
break; break;
} }
System.out.println("-----------------------"); // printBoatStatus(playerYacht);
System.out.println("Sails are in: " + playerYacht.getSailIn());
System.out.println("Heading: " + playerYacht.getHeading());
System.out.println("Velocity: " + playerYacht.getVelocityMMS() / 1000);
System.out.println("Lat: " + playerYacht.getLocation().getLat());
System.out.println("Lng: " + playerYacht.getLocation().getLng());
System.out.println("-----------------------\n");
} }
public static void update() { public static void update() {
@@ -178,7 +168,7 @@ public class GameState implements Runnable {
try { try {
Thread.sleep(1000 / STATE_UPDATES_PER_SECOND); Thread.sleep(1000 / STATE_UPDATES_PER_SECOND);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); System.out.println("[GameState] interrupted exception");
} }
if (currentStage == GameStages.PRE_RACE) { if (currentStage == GameStages.PRE_RACE) {
update(); update();
@@ -190,4 +180,14 @@ public class GameState implements Runnable {
} }
} }
} }
private static void printBoatStatus(Yacht playerYacht) {
System.out.println("-----------------------");
System.out.println("Sails are in: " + playerYacht.getSailIn());
System.out.println("Heading: " + playerYacht.getHeading());
System.out.println("Velocity: " + playerYacht.getVelocityMMS() / 1000);
System.out.println("Lat: " + playerYacht.getLocation().getLat());
System.out.println("Lng: " + playerYacht.getLocation().getLng());
System.out.println("-----------------------\n");
}
} }
@@ -25,6 +25,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
private static final int PORT = 4942; private static final int PORT = 4942;
private static final Integer CLIENT_UPDATES_PER_SECOND = 10; private static final Integer CLIENT_UPDATES_PER_SECOND = 10;
private static final int LOG_LEVEL = 1; private static final int LOG_LEVEL = 1;
private boolean terminated;
private Thread thread; private Thread thread;
@@ -38,6 +39,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
serverLog("IO error in server thread handler upon trying to make new server socket", 0); serverLog("IO error in server thread handler upon trying to make new server socket", 0);
} }
terminated = false;
thread = new Thread(this); thread = new Thread(this);
thread.start(); thread.start();
} }
@@ -54,11 +56,11 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
serverListenThread.start(); serverListenThread.start();
//You should handle interrupts in some way, so that the thread won't keep on forever if you exit the app. //You should handle interrupts in some way, so that the thread won't keep on forever if you exit the app.
while (!thread.isInterrupted()) { while (!terminated) {
try { try {
Thread.sleep(1000 / CLIENT_UPDATES_PER_SECOND); Thread.sleep(1000 / CLIENT_UPDATES_PER_SECOND);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); serverLog("Interrupted exception in Main Server Thread thread sleep", 1);
} }
if (GameState.getCurrentStage() == GameStages.PRE_RACE) { if (GameState.getCurrentStage() == GameStages.PRE_RACE) {
@@ -148,4 +150,8 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
} }
}, 0, 500); }, 0, 500);
} }
public void terminate() {
terminated = true;
}
} }
@@ -27,9 +27,11 @@ public class ServerListenThread extends Thread{
private void acceptConnection() { private void acceptConnection() {
try { try {
Socket thisClient = serverSocket.accept(); Socket thisClient = serverSocket.accept();
if (thisClient != null){ if (thisClient != null && GameState.getCurrentStage().equals(GameStages.LOBBYING)) {
ServerToClientThread thisConnection = new ServerToClientThread(thisClient); ServerToClientThread thisConnection = new ServerToClientThread(thisClient);
delegate.clientConnected(thisConnection); delegate.clientConnected(thisConnection);
} else {
thisClient.close();
} }
} catch (IOException e) { } catch (IOException e) {
e.getMessage(); e.getMessage();
@@ -96,13 +96,12 @@ public class ServerToClientThread implements Runnable, Observer {
all = ln.lines().collect(Collectors.toList()); all = ln.lines().collect(Collectors.toList());
lName = all.get(ThreadLocalRandom.current().nextInt(0, all.size())); lName = all.get(ThreadLocalRandom.current().nextInt(0, all.size()));
} catch (IOException e) { } catch (IOException e) {
System.out.println("IO error in server thread upon grabbing streams"); serverLog("IO error in server thread upon grabbing streams", 1);
e.printStackTrace();
} }
//Attempt threeway handshake with connection //Attempt threeway handshake with connection
sourceId = GameState.getUniquePlayerID(); sourceId = GameState.getUniquePlayerID();
if (threeWayHandshake(sourceId)) { if (threeWayHandshake(sourceId)) {
serverLog("Successful handshake. Client allocated id: " + sourceId, 1); serverLog("Successful handshake. Client allocated id: " + sourceId, 0);
Yacht yacht = new Yacht( Yacht yacht = new Yacht(
"Yacht", sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ" "Yacht", sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ"
); );
@@ -186,7 +185,6 @@ public class ServerToClientThread implements Runnable, Observer {
} catch (Exception e) { } catch (Exception e) {
// TODO: 24/07/17 zyt10 - fix a logic here when a client disconnected // TODO: 24/07/17 zyt10 - fix a logic here when a client disconnected
// serverLog("ERROR OCCURRED, CLOSING SERVER CONNECTION: " + socket.getRemoteSocketAddress().toString(), 1); // serverLog("ERROR OCCURRED, CLOSING SERVER CONNECTION: " + socket.getRemoteSocketAddress().toString(), 1);
// e.printStackTrace();
closeSocket(); closeSocket();
return; return;
} }
@@ -243,7 +241,7 @@ public class ServerToClientThread implements Runnable, Observer {
os.write(id); //Send out new ID looking for echo os.write(id); //Send out new ID looking for echo
confirmationID = is.read(); confirmationID = is.read();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); serverLog("Three way handshake failed", 1);
} }
if (id.equals(confirmationID)) { //ID is echoed back. Connection is a client if (id.equals(confirmationID)) { //ID is echoed back. Connection is a client
@@ -273,7 +271,7 @@ public class ServerToClientThread implements Runnable, Observer {
currentByte = is.read(); currentByte = is.read();
crcBuffer.write(currentByte); crcBuffer.write(currentByte);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); serverLog("Socket read failed", 1);
} }
if (currentByte == -1) { if (currentByte == -1) {
throw new Exception(); throw new Exception();
@@ -299,10 +297,10 @@ public class ServerToClientThread implements Runnable, Observer {
try { try {
os.write(message.getBuffer()); os.write(message.getBuffer());
} catch (SocketException e) { } catch (SocketException e) {
//serverLog("Player " + sourceId + " side socket disconnected", 0); //serverLog("Player " + sourceId + " side socket disconnected", 1);
return; return;
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); serverLog("Message send failed", 1);
} }
} }
+1 -1
View File
@@ -68,7 +68,7 @@ public final class PolarTable {
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); System.out.println("[PolarTable] IO exception");
} }
@@ -37,7 +37,7 @@ public class CanvasMap {
return new Image(connection.getInputStream()); return new Image(connection.getInputStream());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); System.out.println("[CanvasMap] Exception");
return null; return null;
} }
} }
@@ -1,157 +0,0 @@
package seng302.models.stream;
import seng302.models.stream.packets.StreamPacket;
import seng302.server.messages.BoatActionMessage;
import seng302.server.messages.BoatActionType;
import seng302.server.messages.Heartbeat;
import seng302.server.messages.Message;
import java.io.*;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.Comparator;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
public class StreamReceiver extends Thread {
private InputStream inputStream;
private OutputStream outputStream;
private Socket host;
private ByteArrayOutputStream crcBuffer;
private Thread t;
private String threadName;
public static PriorityBlockingQueue<StreamPacket> packetBuffer;
private static boolean moreBytes;
public StreamReceiver(String hostAddress, int hostPort, String threadName) {
this.threadName = threadName;
this.setDaemon(true);
try {
host = new Socket(hostAddress, hostPort);
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
public void run(){
PriorityBlockingQueue<StreamPacket> pq = new PriorityBlockingQueue<>(256, new Comparator<StreamPacket>() {
@Override
public int compare(StreamPacket s1, StreamPacket s2) {
return (int) (s1.getTimeStamp() - s2.getTimeStamp());
}
});
packetBuffer = pq;
connect();
}
public void start () {
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
public StreamReceiver(Socket host, PriorityBlockingQueue packetBuffer){
this.host=host;
this.packetBuffer = packetBuffer;
}
public void connect(){
// int sync1;
// int sync2;
// moreBytes = true;
// while(moreBytes) {
// try {
// crcBuffer = new ByteArrayOutputStream();
// sync1 = readByte();
// sync2 = readByte();
// //checking if it is the start of the packet
// if(sync1 == 0x47 && sync2 == 0x83) {
// int type = readByte();
// //No. of milliseconds since Jan 1st 1970
// long timeStamp = bytesToLong(getBytes(6));
// skipBytes(4);
// long payloadLength = bytesToLong(getBytes(2));
// byte[] payload = getBytes((int) payloadLength);
// Checksum checksum = new CRC32();
// checksum.update(crcBuffer.toByteArray(), 0, crcBuffer.size());
// long computedCrc = checksum.getValue();
// long packetCrc = bytesToLong(getBytes(4));
// if (computedCrc == packetCrc) {
// packetBuffer.add(new StreamPacket(type, payloadLength, timeStamp, payload));
// } else {
// System.err.println("Packet has been dropped");
// }
// }
// } catch (Exception e) {
// moreBytes = false;
// }
// }
}
private int readByte() throws Exception {
int currentByte = -1;
try {
currentByte = inputStream.read();
crcBuffer.write(currentByte);
} catch (IOException e) {
e.printStackTrace();
}
if (currentByte == -1){
throw new Exception();
}
return currentByte;
}
private byte[] getBytes(int n) throws Exception{
byte[] bytes = new byte[n];
for (int i = 0; i < n; i++){
bytes[i] = (byte) readByte();
}
return bytes;
}
private void skipBytes(long n) throws Exception{
for (int i=0; i < n; i++){
readByte();
}
}
/**
* takes an array of up to 7 bytes in little endian format and
* returns a positive long constructed from the input bytes
*
* @return a positive long if there is less than 8 bytes -1 otherwise
*/
private long bytesToLong(byte[] bytes){
long partialLong = 0;
int index = 0;
for (byte b: bytes){
if (index > 6){
return -1;
}
partialLong = partialLong | (b & 0xFFL) << (index * 8);
index++;
}
return partialLong;
}
public static void main(String[] args) {
StreamReceiver sr = new StreamReceiver("csse-s302staff.canterbury.ac.nz", 4941,"TestThread1");
//StreamReceiver sr = new StreamReceiver("livedata.americascup.com", 4941, "TestThread2");
sr.start();
}
public static void noMoreBytes(){
moreBytes = false;
}
}
@@ -65,7 +65,7 @@ public class Simulator extends Observable implements Runnable {
try { try {
Thread.sleep(lapse); Thread.sleep(lapse);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); System.out.println("[Simulator] interrupted exception ");
} }
} }
} }
@@ -31,7 +31,7 @@ public abstract class FileParser {
doc.getDocumentElement().normalize(); doc.getDocumentElement().normalize();
return doc; return doc;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); System.out.println("[FileParser] Exception");
return null; return null;
} }
} }
@@ -45,7 +45,7 @@ public abstract class FileParser {
doc.getDocumentElement().normalize(); doc.getDocumentElement().normalize();
return doc; return doc;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); System.out.println("[FileParser] Exception");
} }
return null; return null;
} }
@@ -1,106 +0,0 @@
package seng302.models.stream;
import org.junit.Before;
import org.junit.Test;
import java.io.*;
import java.lang.reflect.Method;
import java.net.Socket;
import java.util.Comparator;
import java.util.concurrent.PriorityBlockingQueue;
import seng302.models.stream.packets.StreamPacket;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Created by ptg19 on 26/04/17.
*/
public class StreamReceiverTest {
private PriorityBlockingQueue pq;
private byte[] brokenPacket = {0x47, (byte) 0x83, 37, // sync1 sync2 and message type
0b00000000, 0b01000000, 0b00100010, 0b00100100, 0b00011000, 0b00000000, //timestamp
0b00000000, 0b00010000, 0b01000000, 0b00000000, //source id
0b00100010, 0b00101000, // message length
0b00010010, 0b00010010, 0b00010010}; //random start of payload
private byte[] workingPacket = {0x47, (byte) 0x83, 37, // sync1 sync2 and message type
0b00000000, 0b01000000, 0b00100010, 0b00100100, 0b00011000, 0b00000000, //timestamp
0b00000000, 0b00010000, 0b01000000, 0b00000000, //source id
0b00000010, 0b00000000, // message length
0b00010010, 0b00010010, // payload
0b00100110, (byte)0b10000111, 0b00110101, 0b01111000}; //crc
private byte[] crcMismatchPacket = {0x47, (byte) 0x83, 37, // sync1 sync2 and message type
0b00000000, 0b01000000, 0b00100010, 0b00100100, 0b00011000, 0b00000000, //timestamp
0b00000000, 0b00000000, 0b01000000, 0b00000000, //source id
0b00000010, 0b00000000, // message length
0b00010010, 0b00010010, // payload
0b00100110, (byte)0b10000111, 0b00110101, 0b01111000}; //crc
@Before
public void setup(){
pq = new PriorityBlockingQueue<>(256, new Comparator<StreamPacket>() {
@Override
public int compare(StreamPacket s1, StreamPacket s2) {
return (int) (s1.getTimeStamp() - s2.getTimeStamp());
}
});
}
@Test
public void connectExitsOnUnexpectedStreamEnd() throws Exception {
Socket host=mock(Socket.class);
InputStream stream = new ByteArrayInputStream(brokenPacket);
when(host.getInputStream()).thenReturn(stream);
StreamReceiver streamReceiver = new StreamReceiver(host, pq);
streamReceiver.connect();
assert pq.size() == 0;
}
// @Test
// public void connectReadsAPacket() throws Exception {
// Socket host=mock(Socket.class);
// InputStream stream = new ByteArrayInputStream(workingPacket);
// when(host.getInputStream()).thenReturn(stream);
// StreamReceiver streamReceiver = new StreamReceiver(host, pq);
//
// streamReceiver.connect();
// assert pq.size() == 1;
// }
@Test
public void connectDropsAMismatchedCrc() throws Exception {
Socket host=mock(Socket.class);
InputStream stream = new ByteArrayInputStream(crcMismatchPacket);
when(host.getInputStream()).thenReturn(stream);
StreamReceiver streamReceiver = new StreamReceiver(host, pq);
streamReceiver.connect();
assert pq.size() == 0;
}
@Test
public void bytestoLongTest() {
Socket host=mock(Socket.class);
StreamReceiver streamReceiver = new StreamReceiver(host, pq);
try {
Class[] args = new Class[1];
args[0] = byte[].class;
Method bytesToLong = streamReceiver.getClass().getDeclaredMethod("bytesToLong", args);
bytesToLong.setAccessible(true);
byte[] sevenBtyeNumber = {0b01100100, 0b00110100, 0b00010100, 0b00000000, 0b00000000, 0b00000000, (byte)0b10000000};
assert bytesToLong.invoke(streamReceiver, sevenBtyeNumber).equals(36028797020288100L);
byte[] eightByteNumber = {0b01100100, 0b00110100, 0b00010100, 0b00000000, 0b00000000, 0b00000000, (byte)0b10000000, 0b00100101};
assert bytesToLong.invoke(streamReceiver, eightByteNumber).equals(-1L);
byte[] emptyArray = {};
assert bytesToLong.invoke(streamReceiver, emptyArray).equals(0L);
} catch (Exception e){
e.printStackTrace();
}
}
}