mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 06:18:44 +00:00
Documented client packet parser, client state, client state querying runnable, client to server thread and replaced e.printStackTrace() with client log messages.
This commit is contained in:
@@ -59,6 +59,7 @@ public class ClientPacketParser {
|
|||||||
*/
|
*/
|
||||||
public ClientPacketParser() {
|
public ClientPacketParser() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Looks at the type of the packet then sends it to the appropriate parser to extract the
|
* Looks at the type of the packet then sends it to the appropriate parser to extract the
|
||||||
* specific data associated with that packet type
|
* specific data associated with that packet type
|
||||||
@@ -108,7 +109,7 @@ public class ClientPacketParser {
|
|||||||
}
|
}
|
||||||
} catch (NullPointerException e) {
|
} catch (NullPointerException e) {
|
||||||
System.out.println("Error parsing packet");
|
System.out.println("Error parsing packet");
|
||||||
e.printStackTrace();
|
// e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +186,6 @@ public class ClientPacketParser {
|
|||||||
|
|
||||||
int noBoats = payload[22];
|
int noBoats = payload[22];
|
||||||
int raceType = payload[23];
|
int raceType = payload[23];
|
||||||
clientStateBoats = ClientState.getBoats();
|
|
||||||
for (int i = 0; i < noBoats; i++) {
|
for (int i = 0; i < noBoats; i++) {
|
||||||
long boatStatusSourceID = bytesToLong(
|
long boatStatusSourceID = bytesToLong(
|
||||||
Arrays.copyOfRange(payload, 24 + (i * 20), 28 + (i * 20)));
|
Arrays.copyOfRange(payload, 24 + (i * 20), 28 + (i * 20)));
|
||||||
@@ -206,7 +206,9 @@ public class ClientPacketParser {
|
|||||||
boat.setEstimateTimeAtNextMark(estTimeAtNextMark);
|
boat.setEstimateTimeAtNextMark(estTimeAtNextMark);
|
||||||
boat.setEstimateTimeAtFinish(estTimeAtFinish);
|
boat.setEstimateTimeAtFinish(estTimeAtFinish);
|
||||||
|
|
||||||
Yacht clientBoat = clientStateBoats.get((int) boatStatusSourceID);
|
// Update Client State boats when receive race status packet.
|
||||||
|
// Potentially could replace boats in ClientPacketParser.
|
||||||
|
Yacht clientBoat = ClientState.getBoats().get((int) boatStatusSourceID);
|
||||||
clientBoat.setBoatStatus((boatStatus));
|
clientBoat.setBoatStatus((boatStatus));
|
||||||
setBoatLegPosition(clientBoat, boatLegNumber);
|
setBoatLegPosition(clientBoat, boatLegNumber);
|
||||||
clientBoat.setPenaltiesAwarded(boatPenaltyAwarded);
|
clientBoat.setPenaltiesAwarded(boatPenaltyAwarded);
|
||||||
@@ -215,9 +217,12 @@ public class ClientPacketParser {
|
|||||||
clientBoat.setEstimateTimeAtFinish(estTimeAtFinish);
|
clientBoat.setEstimateTimeAtFinish(estTimeAtFinish);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3 is race started
|
// 3 is race started.
|
||||||
|
// ClientState race started flag will be set to true if race started, else set false.
|
||||||
if (raceStatus == 3) {
|
if (raceStatus == 3) {
|
||||||
ClientState.setRaceStarted(true);
|
ClientState.setRaceStarted(true);
|
||||||
|
} else {
|
||||||
|
ClientState.setRaceStarted(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,8 +291,10 @@ public class ClientPacketParser {
|
|||||||
xmlObject.constructXML(doc, messageType);
|
xmlObject.constructXML(doc, messageType);
|
||||||
if (messageType == 7) { //7 is the boat XML
|
if (messageType == 7) { //7 is the boat XML
|
||||||
boats = xmlObject.getBoatXML().getCompetingBoats();
|
boats = xmlObject.getBoatXML().getCompetingBoats();
|
||||||
|
// Set/Update the ClientState boats after receiving new boat xml.
|
||||||
|
// Flag boatsUpdated in ClientState to true.
|
||||||
ClientState.setBoats(xmlObject.getBoatXML().getCompetingBoats());
|
ClientState.setBoats(xmlObject.getBoatXML().getCompetingBoats());
|
||||||
ClientState.setDirtyState(true);
|
ClientState.setBoatsUpdated(true);
|
||||||
}
|
}
|
||||||
if (messageType == 6) { //6 is race info xml
|
if (messageType == 6) { //6 is race info xml
|
||||||
newRaceXmlReceived = true;
|
newRaceXmlReceived = true;
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
package seng302.client;
|
package seng302.client;
|
||||||
|
|
||||||
import com.sun.org.apache.xpath.internal.operations.Bool;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import seng302.models.Yacht;
|
import seng302.models.Yacht;
|
||||||
@@ -17,7 +14,7 @@ public class ClientState {
|
|||||||
private static Boolean raceStarted = false;
|
private static Boolean raceStarted = false;
|
||||||
private static Boolean connectedToHost = false;
|
private static Boolean connectedToHost = false;
|
||||||
private static Map<Integer, Yacht> boats = new ConcurrentHashMap<>();
|
private static Map<Integer, Yacht> boats = new ConcurrentHashMap<>();
|
||||||
private static Boolean dirtyState = true;
|
private static Boolean boatsUpdated = true;
|
||||||
private static String clientSourceId = "";
|
private static String clientSourceId = "";
|
||||||
|
|
||||||
public static String getHostIp() {
|
public static String getHostIp() {
|
||||||
@@ -56,12 +53,12 @@ public class ClientState {
|
|||||||
return boats;
|
return boats;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Boolean isDirtyState() {
|
public static Boolean isBoatsUpdated() {
|
||||||
return dirtyState;
|
return boatsUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setDirtyState(Boolean dirtyState) {
|
public static void setBoatsUpdated(Boolean boatsUpdated) {
|
||||||
ClientState.dirtyState = dirtyState;
|
ClientState.boatsUpdated = boatsUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getClientSourceId() {
|
public static String getClientSourceId() {
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ public class ClientStateQueryingRunnable extends Observable implements Runnable
|
|||||||
|
|
||||||
public ClientStateQueryingRunnable() {}
|
public ClientStateQueryingRunnable() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies observers "game started" if ClientState raceStarted flag is true and terminates itself.
|
||||||
|
* Notifies observers "update players" if ClientState boatsUpdated flag is true and resets the flag to false;
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
while(!terminate) {
|
while(!terminate) {
|
||||||
@@ -29,14 +33,19 @@ public class ClientStateQueryingRunnable extends Observable implements Runnable
|
|||||||
terminate();
|
terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ClientState.isDirtyState()) {
|
if (ClientState.isBoatsUpdated()) {
|
||||||
setChanged();
|
setChanged();
|
||||||
notifyObservers("update players");
|
notifyObservers("update players");
|
||||||
ClientState.setDirtyState(false);
|
ClientState.setBoatsUpdated(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to terminate the thread.
|
||||||
|
*
|
||||||
|
* Currently called by the main while loop when game started is detected.
|
||||||
|
*/
|
||||||
public void terminate() {
|
public void terminate() {
|
||||||
terminate = true;
|
terminate = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ import seng302.server.messages.BoatActionMessage;
|
|||||||
import seng302.server.messages.Message;
|
import seng302.server.messages.Message;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by kre39 on 13/07/17.
|
* A class describing a single connection to a Server for the purposes of sending and receiving on
|
||||||
|
* its own thread.
|
||||||
*/
|
*/
|
||||||
public class ClientToServerThread implements Runnable {
|
public class ClientToServerThread implements Runnable {
|
||||||
|
|
||||||
@@ -30,8 +31,19 @@ public class ClientToServerThread implements Runnable {
|
|||||||
private OutputStream os;
|
private OutputStream os;
|
||||||
|
|
||||||
private Boolean updateClient = true;
|
private Boolean updateClient = true;
|
||||||
private ByteArrayOutputStream crcBuffer;
|
private ByteArrayOutputStream crcBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for ClientToServerThread which takes in ipAddress and portNumber and attempts to
|
||||||
|
* connect to the specified ipAddress and port.
|
||||||
|
*
|
||||||
|
* Upon successful socket connection, threeWayHandshake will be preformed and the instance will
|
||||||
|
* be put on a thread and run immediately.
|
||||||
|
*
|
||||||
|
* @param ipAddress a string of ip address to be connected to
|
||||||
|
* @param portNumber an integer port number
|
||||||
|
* @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();
|
||||||
@@ -40,7 +52,7 @@ public class ClientToServerThread implements Runnable {
|
|||||||
Integer allocatedID = threeWayHandshake();
|
Integer allocatedID = threeWayHandshake();
|
||||||
if (allocatedID != null) {
|
if (allocatedID != null) {
|
||||||
ourID = allocatedID;
|
ourID = allocatedID;
|
||||||
clientLog("Successful handshake. Allocated ID: " + ourID, 1);
|
clientLog("Successful handshake. Allocated ID: " + ourID, 0);
|
||||||
ClientState.setClientSourceId(String.valueOf(ourID));
|
ClientState.setClientSourceId(String.valueOf(ourID));
|
||||||
} else {
|
} else {
|
||||||
clientLog("Unsuccessful handshake", 1);
|
clientLog("Unsuccessful handshake", 1);
|
||||||
@@ -50,31 +62,30 @@ public class ClientToServerThread implements Runnable {
|
|||||||
|
|
||||||
thread = new Thread(this);
|
thread = new Thread(this);
|
||||||
thread.start();
|
thread.start();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints out log message and time happened.
|
||||||
|
* Only perform task if log level is below LOG_LEVEL variable.
|
||||||
|
*
|
||||||
|
* @param message a string of message to be printed out
|
||||||
|
* @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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform the thread loop. Will exit loop if ClientState connected to host variable is false.
|
||||||
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
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 {
|
||||||
//Perform a write if it is time to as delegated by the MainServerThread
|
|
||||||
if (updateClient) {
|
|
||||||
// TODO: 13/07/17 wmu16 - Write out game state - some function that would write all appropriate messages to this output stream
|
|
||||||
// try {
|
|
||||||
// GameState.outputState(os);
|
|
||||||
// } catch (IOException e) {
|
|
||||||
// System.out.println("IO error in server thread upon writing to output stream");
|
|
||||||
// }
|
|
||||||
updateClient = false;
|
|
||||||
}
|
|
||||||
crcBuffer = new ByteArrayOutputStream();
|
crcBuffer = new ByteArrayOutputStream();
|
||||||
sync1 = readByte();
|
sync1 = readByte();
|
||||||
sync2 = readByte();
|
sync2 = readByte();
|
||||||
@@ -101,7 +112,7 @@ public class ClientToServerThread implements Runnable {
|
|||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
closeSocket();
|
closeSocket();
|
||||||
e.printStackTrace();
|
clientLog("Disconnected from server", 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,7 +122,7 @@ public class ClientToServerThread implements Runnable {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listens for an allocated sourceID and returns it to the server if recieved
|
* Listens for an allocated sourceID and returns it to the server if received
|
||||||
* @return the sourceID allocated to us by the server
|
* @return the sourceID allocated to us by the server
|
||||||
*/
|
*/
|
||||||
private Integer threeWayHandshake() {
|
private Integer threeWayHandshake() {
|
||||||
@@ -120,14 +131,15 @@ public class ClientToServerThread implements Runnable {
|
|||||||
try {
|
try {
|
||||||
ourSourceID = is.read();
|
ourSourceID = is.read();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
clientLog("Three way handshake failed", 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
if (ourSourceID != null) {
|
if (ourSourceID != null) {
|
||||||
try {
|
try {
|
||||||
os.write(ourSourceID);
|
os.write(ourSourceID);
|
||||||
return ourSourceID;
|
return ourSourceID;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
clientLog("Three way handshake failed", 1);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -143,8 +155,7 @@ public class ClientToServerThread implements Runnable {
|
|||||||
try {
|
try {
|
||||||
os.write(boatActionMessage.getBuffer());
|
os.write(boatActionMessage.getBuffer());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
clientLog("COULD NOT WRITE TO SERVER", 0);
|
clientLog("Could not write to server", 1);
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +164,7 @@ public class ClientToServerThread implements Runnable {
|
|||||||
try {
|
try {
|
||||||
socket.close();
|
socket.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
clientLog("Failed to close the socket", 0);
|
clientLog("Failed to close the socket", 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,7 +175,7 @@ public class ClientToServerThread implements Runnable {
|
|||||||
currentByte = is.read();
|
currentByte = is.read();
|
||||||
crcBuffer.write(currentByte);
|
crcBuffer.write(currentByte);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
clientLog("Read byte failed", 1);
|
||||||
}
|
}
|
||||||
if (currentByte == -1){
|
if (currentByte == -1){
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
|
|||||||
Reference in New Issue
Block a user