Merge branch 'Story62_Reading_Keystrokes' into story61_player_perspective

This commit is contained in:
Calum
2017-07-20 13:05:26 +12:00
10 changed files with 172 additions and 446 deletions
@@ -1,31 +1,39 @@
package seng302.controllers; package seng302.controllers;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.URL;
import java.util.Enumeration;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.control.TableColumn; import javafx.fxml.Initializable;
import javafx.scene.control.TableView; import javafx.scene.control.ListView;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import javafx.scene.text.Text; import javafx.scene.text.Text;
import seng302.gameServer.GameServerThread;
import seng302.gameServer.GameStages; import seng302.gameServer.GameStages;
import seng302.gameServer.GameState; import seng302.gameServer.GameState;
import java.io.IOException;
/** /**
* A class describing the actions of the lobby screen * A class describing the actions of the lobby screen
* Created by wmu16 on 10/07/17. * Created by wmu16 on 10/07/17.
*/ */
public class LobbyController { public class LobbyController implements Initializable{
@FXML
private ListView competitorsListView;
@FXML @FXML
private GridPane lobbyScreen; private GridPane lobbyScreen;
@FXML @FXML
private Text lobbyIpText; private Text lobbyIpText;
private GameServerThread gameServerThread; private static ObservableList competitors;
private void setContentPane(String jfxUrl) { private void setContentPane(String jfxUrl) {
try { try {
@@ -42,6 +50,45 @@ public class LobbyController {
} }
} }
@Override
public void initialize(URL location, ResourceBundle resources) {
lobbyIpText.setText("Lobby Host IP: " + getLocalHostIp());
}
public void initialize() {
competitors = FXCollections.observableArrayList();
competitorsListView.setItems(competitors);
}
private String getLocalHostIp() {
String ipAddress = null;
try {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface ni = e.nextElement();
if (ni.isLoopback())
continue;
if(ni.isPointToPoint())
continue;
if(ni.isVirtual())
continue;
Enumeration<InetAddress> addresses = ni.getInetAddresses();
while(addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
if(address instanceof Inet4Address) { // skip all ipv6
ipAddress = address.getHostAddress();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
if (ipAddress == null) {
System.out.println("[HOST] Cannot obtain local host ip address.");
}
return ipAddress;
}
@FXML @FXML
public void leaveLobbyButtonPressed() { public void leaveLobbyButtonPressed() {
@@ -49,7 +96,7 @@ public class LobbyController {
setContentPane("/views/StartScreenView.fxml"); setContentPane("/views/StartScreenView.fxml");
System.out.println("Leaving lobby!"); System.out.println("Leaving lobby!");
GameState.setCurrentStage(GameStages.CANCELLED); GameState.setCurrentStage(GameStages.CANCELLED);
gameServerThread.terminateGame(); // TODO: 20/07/17 wmu16 - Implement some way of terminating the game
} }
@@ -57,8 +104,4 @@ public class LobbyController {
public void readyButtonPressed() { public void readyButtonPressed() {
GameState.setCurrentStage(GameStages.RACING); GameState.setCurrentStage(GameStages.RACING);
} }
protected void setGameServerThread(GameServerThread gameServerThread) {
this.gameServerThread = gameServerThread;
}
} }
@@ -8,8 +8,7 @@ import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import seng302.client.ClientToServerThread; import seng302.client.ClientToServerThread;
import seng302.gameServer.GameState; import seng302.gameServer.GameState;
import seng302.gameServerWithThreading.MainServerThread; import seng302.gameServer.MainServerThread;
import seng302.models.stream.StreamReceiver;
import java.io.IOException; import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
@@ -64,7 +63,6 @@ public class StartScreenController {
String ipAddress = InetAddress.getLocalHost().getHostAddress(); String ipAddress = InetAddress.getLocalHost().getHostAddress();
new GameState(ipAddress); new GameState(ipAddress);
new MainServerThread().start(); new MainServerThread().start();
// new GameServerThread("Fuck you");
// get the lobby controller so that we can pass the game server thread to it // get the lobby controller so that we can pass the game server thread to it
setContentPane("/views/LobbyView.fxml"); setContentPane("/views/LobbyView.fxml");
@@ -80,10 +78,14 @@ public class StartScreenController {
public void connectButtonPressed() { public void connectButtonPressed() {
// TODO: 10/07/17 wmu16 - Finish function // TODO: 10/07/17 wmu16 - Finish function
String ipAddress = ipTextField.getText().trim().toLowerCase(); String ipAddress = ipTextField.getText().trim().toLowerCase();
ClientToServerThread clientToServerThread = new ClientToServerThread(ipAddress, 4950); try {
controller.setClientToServerThread(clientToServerThread); ClientToServerThread clientToServerThread = new ClientToServerThread(ipAddress, 4950);
clientToServerThread.start(); controller.setClientToServerThread(clientToServerThread);
clientToServerThread.start();
setContentPane("/views/LobbyView.fxml");
} catch (Exception e){
e.printStackTrace();
}
} }
public void setController(Controller controller) { public void setController(Controller controller) {
@@ -5,9 +5,9 @@ import seng302.models.Player;
public interface ClientConnectionDelegate { public interface ClientConnectionDelegate {
/** /**
* A player has connected to the server * A player has connected to the server
* @param player The player that has connected * @param serverToClientThread The player that has connected
*/ */
void clientConnected(Player player); void clientConnected(ServerToClientThread serverToClientThread);
/** /**
* A player has disconnected from the server * A player has disconnected from the server
@@ -1,368 +0,0 @@
package seng302.gameServer;
import seng302.models.Player;
import seng302.models.Yacht;
import seng302.server.messages.*;
import seng302.server.simulator.Boat;
import seng302.server.simulator.Simulator;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.SocketOption;
import java.net.SocketOptions;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.*;
public class GameServerThread implements Runnable, Observer, ClientConnectionDelegate{
private static final Integer MAX_NUM_PLAYERS = 10;
public static final int PORT_NUMBER = 4950;
private Boolean hosting = true;
private ServerSocketChannel server;
private long startTime;
private short seqNum;
private final int RACE_STATUS_PERIOD = 1000/2;
private final int RACE_START_STATUS_PERIOD = 1000;
private final int BOAT_LOCATION_PERIOD = 1000/5;
private final int TIME_TILL_RACE_START = 20*1000;
private static final int LOG_LEVEL = 1;
public GameServerThread(String threadName){
Thread runner = new Thread(this, threadName);
runner.setDaemon(true);
seqNum = 0;
runner.start();
}
static void serverLog(String message, int logLevel){
if(logLevel <= LOG_LEVEL){
System.out.println("[SERVER] " + message);
}
}
/**
* Creates and returns an XML Message from the file specified
* @param fileName The source XML file
* @param type The XML Message type
* @return The XML Message
*/
private Message getXmlMessage(String fileName, XMLMessageSubType type){
String fileContents = null;
try {
InputStream thisStream = this.getClass().getResourceAsStream(fileName);
fileContents = new String(org.apache.commons.io.IOUtils.toByteArray(thisStream));
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e){
return null;
}
if (fileContents != null){
return new XMLMessage(fileContents, type, seqNum);
}
return null;
}
/**
* @return Get a race status message for the current race
*/
private Message getRaceStatusMessage(){
List<BoatSubMessage> boatSubMessages = new ArrayList<>();
BoatStatus boatStatus;
RaceStatus raceStatus;
boolean thereAreBoatsNotFinished = false;
for (Player player : GameState.getPlayers()){
Yacht y = player.getYacht();
if (GameState.getCurrentStage() == GameStages.PRE_RACE){
boatStatus = BoatStatus.PRESTART;
thereAreBoatsNotFinished = true;
}
else if(false){ //@TODO if boat has finished
boatStatus = BoatStatus.FINISHED;
}
else{
boatStatus = BoatStatus.PRESTART;
thereAreBoatsNotFinished = true;
}
BoatSubMessage m = new BoatSubMessage(y.getSourceID(), boatStatus, y.getLastMarkRounded().getId(), 0, 0, 1234l, 1234l);
boatSubMessages.add(m);
}
if (thereAreBoatsNotFinished){
if (GameState.getCurrentStage() == GameStages.RACING){
raceStatus = RaceStatus.STARTED;
}
else{
long currentTime = System.currentTimeMillis();
long timeDifference = startTime - currentTime;
if (timeDifference > 60*3){
raceStatus = RaceStatus.PRESTART;
}
else if (timeDifference > 60){
raceStatus = RaceStatus.WARNING;
}
else{
raceStatus = RaceStatus.PREPARATORY;
}
}
}
else{
raceStatus = RaceStatus.TERMINATED;
}
return new RaceStatusMessage(1, raceStatus, startTime, WindDirection.SOUTH,
100, GameState.getPlayers().size(), RaceType.MATCH_RACE, 1, boatSubMessages);
}
/**
* Start sending race start status messages until race starts
*/
private void startSendingRaceStartStatusMessages(){
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
Message raceStartStatusMessage = new RaceStartStatusMessage(seqNum, startTime , 1,
RaceStartNotificationType.SET_RACE_START_TIME);
try {
if (startTime < System.currentTimeMillis() && GameState.getCurrentStage() != GameStages.RACING){
}
else{
broadcast(raceStartStatusMessage);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}, 0, RACE_START_STATUS_PERIOD);
}
/**
* Start sending race start status messages until race starts
*/
private void startSendingRaceStatusMessages(){
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
Message raceStatusMessage = getRaceStatusMessage();
try {
broadcast(raceStatusMessage);
} catch (IOException e) {
e.printStackTrace();
}
}
}, 0, RACE_STATUS_PERIOD);
}
/**
* Sends the race, boat, and regatta XML files to the client
*/
private void sendXml(){
try{
Message raceData = getXmlMessage("/server_config/race.xml", XMLMessageSubType.RACE);
Message boatData = getXmlMessage("/server_config/boats.xml", XMLMessageSubType.BOAT);
Message regatta = getXmlMessage("/server_config/regatta.xml", XMLMessageSubType.REGATTA);
if (raceData != null){
broadcast(raceData);
}
if (boatData != null){
broadcast(boatData);
}
if (regatta != null){
broadcast(regatta);
}
} catch (IOException e) {
serverLog("Couldn't send an XML Message: " + e.getMessage(), 0);
}
}
/**
* Send the post-start race course information
*/
private void sendPostStartCourseXml(){
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
try {
Message raceData = getXmlMessage("/server_config/courseLimits.xml", XMLMessageSubType.RACE);
if (raceData != null) {
broadcast(raceData);
}
}catch (IOException e) {
serverLog("Couldn't send an XML Message: " + e.getMessage(), 0);
}
}
},1000);
//Delays the new course xml data for 25 seconds so the boats are able to pass the starting line
}
public void run() {
ServerListenThread serverListenThread;
HeartbeatThread heartbeatThread;
Boolean serverIsSendingMessages = false;
try{
server = ServerSocketChannel.open();
server.socket().bind(new InetSocketAddress("localhost", PORT_NUMBER));
serverListenThread = new ServerListenThread(server, this);
heartbeatThread = new HeartbeatThread(this);
heartbeatThread.start();
serverListenThread.start();
}
catch (IOException e){
serverLog("Failed to bind socket: " + e.getMessage(), 0);
}
while (hosting) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (GameState.getCurrentStage() == GameStages.RACING && !serverIsSendingMessages) {
serverLog("Race Started", 0);
sendXml();
startSendingRaceStartStatusMessages();
//startSendingRaceStatusMessages();
sendPostStartCourseXml();
serverIsSendingMessages = true;
}
else if (GameState.getCurrentStage() == GameStages.FINISHED) {
serverLog("Race Finished", 0);
}
startTime = System.currentTimeMillis() + TIME_TILL_RACE_START;
}
}
// /**
// * Start sending static boat position updates when race has finished
// */
// private void startSendingRaceFinishedBoatPositions(){
// Timer t = new Timer();
// t.schedule(new TimerTask() {
// @Override
// public void run() {
// try {
// for (Boat b : raceSimulator.getBoats()){
// Message m = new BoatLocationMessage(b.getSourceID(), seqNum, b.getLat(),
// b.getLng(), b.getLastPassedCorner().getBearingToNextCorner(),
// ((long) 0));
//
// server.send(m);
// }
//
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }, 0, BOAT_LOCATION_PERIOD);
// }
/**
* A client has tried to connect to the server
* @param player The player that connected
*/
@Override
public void clientConnected(Player player) {
if (GameState.getPlayers().size() < MAX_NUM_PLAYERS && GameState.getCurrentStage() == GameStages.LOBBYING) {
serverLog("Player Connected", 0);
GameState.addPlayer(player);
sendXml();
}
}
/**
* A player has left the game, remove the player from the GameState
* @param player The player that left
*/
@Override
public void clientDisconnected(Player player) {
serverLog("Player disconnected", 0);
GameState.removePlayer(player);
sendXml();
}
void broadcast(Message message) throws IOException{
for(Player player : GameState.getPlayers()) {
//heh
player.getSocketChannel().socket().getOutputStream().write(message.getBuffer());
}
seqNum++;
}
/**
* Send a boat location message when they are updated by the simulator
* @param o .
* @param arg .
*/
@Override
@SuppressWarnings("unchecked")
public void update(Observable o, Object arg) {
/* Only send if server started
// TODO: I don't understand why i need to check server is null or not ... confused - haoming 2/5/17
if(server == null || !server.isStarted()){
return;
}
int numOfBoatsFinished = 0;
for (Boat boat : (List<Boat>) arg){
try {
if (boat.isFinished()) {
numOfBoatsFinished ++;
if (!boatsFinished.get(boat.getSourceID())) {
boatsFinished.put(boat.getSourceID(), true);
}
}
Message m = new BoatLocationMessage(boat.getSourceID(), 1, boat.getLat(),
boat.getLng(), boat.getLastPassedCorner().getBearingToNextCorner(),
((long) boat.getSpeed()));
broadcast(m);
} catch (IOException e) {
serverLog("Couldn't send a boat status message", 3);
return;
}
catch (NullPointerException e){
e.printStackTrace();
}*/
}
// if (numOfBoatsFinished == ((List<Boat>) arg).size()) {
// startSendingRaceFinishedBoatPositions();
// }
//}
public void terminateGame() {
try {
//TODO: for now, I just close the socket, but i think we should terminate the whole thread instead. -hyi25 13 July
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@@ -18,7 +18,7 @@ public class HeartbeatThread extends Thread{
private Integer seqNum; private Integer seqNum;
private Stack<Player> disconnectedPlayers; private Stack<Player> disconnectedPlayers;
HeartbeatThread(ClientConnectionDelegate delegate){ public HeartbeatThread(ClientConnectionDelegate delegate){
this.delegate = delegate; this.delegate = delegate;
seqNum = 0; seqNum = 0;
disconnectedPlayers = new Stack<>(); disconnectedPlayers = new Stack<>();
@@ -43,15 +43,15 @@ public class HeartbeatThread extends Thread{
Message heartbeat = new Heartbeat(seqNum); Message heartbeat = new Heartbeat(seqNum);
for (Player player : GameState.getPlayers()){ for (Player player : GameState.getPlayers()){
if (!player.getSocketChannel().isConnected()){ if (!player.getSocket().isConnected()){
playerLostConnection(player);
}
try {
player.getSocket().getOutputStream().write(heartbeat.getBuffer());
} catch (IOException e) {
playerLostConnection(player); playerLostConnection(player);
} }
//
// try {
// player.getSocketChannel().socket().getOutputStream().write(heartbeat.getBuffer());
// } catch (IOException e) {
// playerLostConnection(player);
// }
} }
updateDelegate(); updateDelegate();
@@ -1,7 +1,6 @@
package seng302.gameServerWithThreading; package seng302.gameServer;
import seng302.gameServer.GameStages; import seng302.models.Player;
import seng302.gameServer.GameState;
import seng302.models.stream.PacketBufferDelegate; import seng302.models.stream.PacketBufferDelegate;
import seng302.models.stream.StreamParser; import seng302.models.stream.StreamParser;
import seng302.models.stream.packets.StreamPacket; import seng302.models.stream.packets.StreamPacket;
@@ -16,10 +15,11 @@ import java.util.concurrent.PriorityBlockingQueue;
* A class describing the overall server, which creates and collects server threads for each client * A class describing the overall server, which creates and collects server threads for each client
* Created by wmu16 on 13/07/17. * Created by wmu16 on 13/07/17.
*/ */
public class MainServerThread extends Thread implements PacketBufferDelegate{ public class MainServerThread extends Thread implements PacketBufferDelegate, ClientConnectionDelegate{
private static final int PORT = 4950; private static final int PORT = 4950;
private static final Integer MAX_NUM_PLAYERS = 1; private static final Integer MAX_NUM_PLAYERS = 3;
private static final int LOG_LEVEL = 1;
private ServerSocket serverSocket = null; private ServerSocket serverSocket = null;
private Socket socket; private Socket socket;
@@ -40,6 +40,15 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{
public void run() { public void run() {
ServerListenThread serverListenThread;
HeartbeatThread heartbeatThread;
serverListenThread = new ServerListenThread(serverSocket, this);
heartbeatThread = new HeartbeatThread(this);
heartbeatThread.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 (!isInterrupted()) { while (!isInterrupted()) {
try { try {
@@ -48,21 +57,9 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{
e.printStackTrace(); e.printStackTrace();
} }
//LOBBYING
if (GameState.getCurrentStage() == GameStages.LOBBYING && GameState.getPlayers().size() < MAX_NUM_PLAYERS) {
try {
// TODO: 14/07/17 wmu16 - Get out of blocking call somehow after a time
socket = serverSocket.accept();
} catch (IOException e) {
System.out.println("IO error in server thread handler upon trying to accept connection");
}
ServerToClientThread thread = new ServerToClientThread(socket, this);
serverToClientThreads.add(thread);
thread.start();
}
//RACING //RACING
else if (GameState.getCurrentStage() == GameStages.RACING) { if (GameState.getCurrentStage() == GameStages.RACING) {
} }
@@ -97,15 +94,46 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{
} }
} }
public void updateClients() { public void updateClients() {
for (ServerToClientThread serverToClientThread : serverToClientThreads) { for (ServerToClientThread serverToClientThread : serverToClientThreads) {
serverToClientThread.updateClient(); serverToClientThread.updateClient();
} }
} }
static void serverLog(String message, int logLevel){
if(logLevel <= LOG_LEVEL){
System.out.println("[SERVER] " + message);
}
}
@Override @Override
public boolean addToBuffer(StreamPacket streamPacket) { public boolean addToBuffer(StreamPacket streamPacket) {
System.out.println("HEY HI"); System.out.println("HEY HI");
return packetBuffer.add(streamPacket); return packetBuffer.add(streamPacket);
} }
/**
* A client has tried to connect to the server
* @param serverToClientThread The player that connected
*/
@Override
public void clientConnected(ServerToClientThread serverToClientThread) {
serverLog("Player Connected From " + serverToClientThread.getName(), 0);
serverToClientThreads.add(serverToClientThread);
}
/**
* A player has left the game, remove the player from the GameState
* @param player The player that left
*/
@Override
public void clientDisconnected(Player player) {
serverLog("Player disconnected", 0);
GameState.removePlayer(player);
// sendXml();
}
} }
@@ -3,6 +3,8 @@ package seng302.gameServer;
import seng302.models.Player; import seng302.models.Player;
import java.io.IOException; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.ServerSocketChannel; import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel; import java.nio.channels.SocketChannel;
@@ -11,11 +13,11 @@ import java.nio.channels.SocketChannel;
* Created by wmu16 on 11/07/17. * Created by wmu16 on 11/07/17.
*/ */
public class ServerListenThread extends Thread{ public class ServerListenThread extends Thread{
private ServerSocketChannel socketChannel; private ServerSocket serverSocket;
private ClientConnectionDelegate delegate; private ClientConnectionDelegate delegate;
ServerListenThread(ServerSocketChannel socketChannel, ClientConnectionDelegate delegate){ public ServerListenThread(ServerSocket serverSocket, ClientConnectionDelegate delegate){
this.socketChannel = socketChannel; this.serverSocket = serverSocket;
this.delegate = delegate; this.delegate = delegate;
} }
@@ -24,10 +26,11 @@ public class ServerListenThread extends Thread{
*/ */
private void acceptConnection() { private void acceptConnection() {
try { try {
SocketChannel thisClient = socketChannel.accept(); Socket thisClient = serverSocket.accept();
if (thisClient.socket() != null){ if (thisClient != null){
Player thisPlayer = new Player(thisClient); ServerToClientThread thisConnection = new ServerToClientThread(thisClient);
delegate.clientConnected(thisPlayer); thisConnection.start();
delegate.clientConnected(thisConnection);
} }
} catch (IOException e) { } catch (IOException e) {
e.getMessage(); e.getMessage();
@@ -1,4 +1,4 @@
package seng302.gameServerWithThreading; package seng302.gameServer;
import seng302.gameServer.GameState; import seng302.gameServer.GameState;
import seng302.models.Player; import seng302.models.Player;
@@ -27,13 +27,11 @@ public class ServerToClientThread extends Thread {
private ByteArrayOutputStream crcBuffer; private ByteArrayOutputStream crcBuffer;
private final PacketBufferDelegate packetBufferDelegate;
private Boolean userIdentified = false; private Boolean userIdentified = false;
private Boolean connected = true; private Boolean connected = true;
private Boolean updateClient = true; private Boolean updateClient = true;
public ServerToClientThread(Socket socket, PacketBufferDelegate packetBufferDelegate) { public ServerToClientThread(Socket socket) {
this.socket = socket; this.socket = socket;
try { try {
is = socket.getInputStream(); is = socket.getInputStream();
@@ -41,17 +39,17 @@ public class ServerToClientThread extends Thread {
} catch (IOException e) { } catch (IOException e) {
System.out.println("IO error in server thread upon grabbing streams"); System.out.println("IO error in server thread upon grabbing streams");
} }
this.packetBufferDelegate = packetBufferDelegate; // threeWayHandshake();
// threeWayHandshake(); GameState.addPlayer(new Player(socket));
GameState.addPlayer(new Player(socket.getChannel()));
} }
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(true) { while(true) {
//System.out.print(".");
try { try {
//Perform a write if it is time to as delegated by the MainServerThread //Perform a write if it is time to as delegated by the MainServerThread
if (updateClient) { if (updateClient) {
@@ -80,9 +78,9 @@ public class ServerToClientThread extends Thread {
long computedCrc = checksum.getValue(); long computedCrc = checksum.getValue();
long packetCrc = Message.bytesToLong(getBytes(4)); long packetCrc = Message.bytesToLong(getBytes(4));
if (computedCrc == packetCrc) { if (computedCrc == packetCrc) {
//System.out.println("RECEIVED A PACKET");
StreamParser.parsePacket(new StreamPacket(type, payloadLength, timeStamp, payload)); StreamParser.parsePacket(new StreamPacket(type, payloadLength, timeStamp, payload));
// TODO: 17/07/17 wmu16 - Fix this or maybe we dont need to go through the main server at all!?!? // TODO: 17/07/17 wmu16 - Fix this or maybe we dont need to go through the main server at all!?!?
// packetBufferDelegate.addToBuffer(new StreamPacket(type, payloadLength, timeStamp, payload));
} else { } else {
System.err.println("Packet has been dropped"); System.err.println("Packet has been dropped");
} }
@@ -139,6 +137,7 @@ public class ServerToClientThread extends Thread {
private int readByte() throws Exception { private int readByte() throws Exception {
int currentByte = -1; int currentByte = -1;
try { try {
// @TODO @FIX ConnectionReset Exception when a client disconnects before it is garbage collected
currentByte = is.read(); currentByte = is.read();
crcBuffer.write(currentByte); crcBuffer.write(currentByte);
} catch (IOException e) { } catch (IOException e) {
+11 -13
View File
@@ -3,6 +3,7 @@ package seng302.models;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import java.io.IOException; import java.io.IOException;
import java.net.Socket;
import java.nio.channels.SocketChannel; import java.nio.channels.SocketChannel;
/** /**
@@ -11,17 +12,17 @@ import java.nio.channels.SocketChannel;
*/ */
public class Player { public class Player {
private SocketChannel socketChannel; private Socket socket;
private Yacht yacht; private Yacht yacht;
private Integer lastMarkPassed; private Integer lastMarkPassed;
public Player(SocketChannel socketChannel) { public Player(Socket socket) {
this.socketChannel = socketChannel; this.socket = socket;
} }
public SocketChannel getSocketChannel() { public Socket getSocket() {
return socketChannel; return socket;
} }
public Integer getLastMarkPassed() { public Integer getLastMarkPassed() {
@@ -40,15 +41,12 @@ public class Player {
public String toString() { public String toString() {
String playerAddress = null; String playerAddress = null;
if (socketChannel == null){ if (socket == null){
return "Disconnected Player"; return "Disconnected Player";
} }
try { playerAddress = socket.getRemoteSocketAddress().toString();
playerAddress = socketChannel.getRemoteAddress().toString();
} catch (IOException e) {
e.printStackTrace();
}
return playerAddress; return playerAddress;
} }
@@ -63,11 +61,11 @@ public class Player {
return false; return false;
} }
return ((Player) obj).socketChannel.equals(socketChannel); return ((Player) obj).socket.equals(socket);
} }
@Override @Override
public int hashCode(){ public int hashCode(){
return socketChannel.hashCode(); return socket.hashCode();
} }
} }
+23 -2
View File
@@ -15,7 +15,7 @@
<GridPane fx:id="lobbyScreen" nodeOrientation="LEFT_TO_RIGHT" prefHeight="533.0" prefWidth="802.0" style="-fx-background-color: #2C2c36;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.controllers.LobbyController"> <GridPane fx:id="lobbyScreen" nodeOrientation="LEFT_TO_RIGHT" prefHeight="533.0" prefWidth="802.0" style="-fx-background-color: #2C2c36;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.controllers.LobbyController">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
</columnConstraints> </columnConstraints>
<rowConstraints> <rowConstraints>
<RowConstraints maxHeight="171.0" minHeight="0.0" prefHeight="31.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="171.0" minHeight="0.0" prefHeight="31.0" vgrow="SOMETIMES" />
@@ -41,6 +41,27 @@
<Button focusTraversable="false" mnemonicParsing="false" onAction="#leaveLobbyButtonPressed" text="Leave Lobby" GridPane.columnIndex="1" GridPane.halignment="CENTER" /> <Button focusTraversable="false" mnemonicParsing="false" onAction="#leaveLobbyButtonPressed" text="Leave Lobby" GridPane.columnIndex="1" GridPane.halignment="CENTER" />
</children> </children>
</GridPane> </GridPane>
<AnchorPane focusTraversable="true" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1" /> <AnchorPane focusTraversable="true" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
<children>
<GridPane layoutX="335.0" layoutY="146.0" prefHeight="399.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="261.0" minWidth="0.0" prefWidth="2.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="-Infinity" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="261.0" minWidth="0.0" prefWidth="2.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="125.0" minHeight="0.0" prefHeight="0.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="266.0" minHeight="10.0" prefHeight="266.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
<children>
<ListView fx:id="competitorsListView" layoutX="154.0" layoutY="59.0" prefHeight="266.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
</children>
</GridPane>
</children></AnchorPane>
</children> </children>
</GridPane> </GridPane>