mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Fixed bug that stopped clients from getting updated xml data.
#issue[48] #bug
This commit is contained in:
@@ -44,6 +44,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
|
|||||||
HeartbeatThread heartbeatThread;
|
HeartbeatThread heartbeatThread;
|
||||||
|
|
||||||
serverListenThread = new ServerListenThread(serverSocket, this);
|
serverListenThread = new ServerListenThread(serverSocket, this);
|
||||||
|
|
||||||
heartbeatThread = new HeartbeatThread(this);
|
heartbeatThread = new HeartbeatThread(this);
|
||||||
|
|
||||||
heartbeatThread.start();
|
heartbeatThread.start();
|
||||||
@@ -102,9 +103,11 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
|
|||||||
public void clientConnected(ServerToClientThread serverToClientThread) {
|
public void clientConnected(ServerToClientThread serverToClientThread) {
|
||||||
serverLog("Player Connected From " + serverToClientThread.getThread().getName(), 0);
|
serverLog("Player Connected From " + serverToClientThread.getThread().getName(), 0);
|
||||||
serverToClientThreads.add(serverToClientThread);
|
serverToClientThreads.add(serverToClientThread);
|
||||||
this.addObserver(serverToClientThread);
|
serverToClientThread.addConnectionListener(() -> {
|
||||||
setChanged();
|
for (ServerToClientThread thread : serverToClientThreads) {
|
||||||
notifyObservers();
|
thread.sendSetupMessages();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,11 +124,15 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
|
|||||||
serverLog("Player " + player.getYacht().getSourceId() + "'s socket disconnected", 0);
|
serverLog("Player " + player.getYacht().getSourceId() + "'s socket disconnected", 0);
|
||||||
GameState.removeYacht(player.getYacht().getSourceId());
|
GameState.removeYacht(player.getYacht().getSourceId());
|
||||||
GameState.removePlayer(player);
|
GameState.removePlayer(player);
|
||||||
|
ServerToClientThread closedConnection = null;
|
||||||
for (ServerToClientThread serverToClientThread : serverToClientThreads) {
|
for (ServerToClientThread serverToClientThread : serverToClientThreads) {
|
||||||
if (serverToClientThread.getSocket() == player.getSocket()) {
|
if (serverToClientThread.getSocket() == player.getSocket()) {
|
||||||
this.deleteObserver(serverToClientThread);
|
closedConnection = serverToClientThread;
|
||||||
|
} else {
|
||||||
|
serverToClientThread.sendSetupMessages();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
serverToClientThreads.remove(closedConnection);
|
||||||
setChanged();
|
setChanged();
|
||||||
notifyObservers();
|
notifyObservers();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ import java.net.SocketException;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Observable;
|
|
||||||
import java.util.Observer;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.zip.CRC32;
|
import java.util.zip.CRC32;
|
||||||
@@ -44,7 +42,15 @@ import seng302.utilities.XMLGenerator;
|
|||||||
* its own thread. All server threads created and owned by the server thread handler which can
|
* its own thread. All server threads created and owned by the server thread handler which can
|
||||||
* trigger client updates on its threads Created by wmu16 on 13/07/17.
|
* trigger client updates on its threads Created by wmu16 on 13/07/17.
|
||||||
*/
|
*/
|
||||||
public class ServerToClientThread implements Runnable, Observer {
|
public class ServerToClientThread implements Runnable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called to notify listeners when this thread receives a connection correctly.
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
interface ConnectionListener {
|
||||||
|
void notifyConnection ();
|
||||||
|
}
|
||||||
|
|
||||||
private static final Integer LOG_LEVEL = 1;
|
private static final Integer LOG_LEVEL = 1;
|
||||||
private static final Integer MAX_ID_ATTEMPTS = 10;
|
private static final Integer MAX_ID_ATTEMPTS = 10;
|
||||||
@@ -57,8 +63,6 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
|
|
||||||
private ByteArrayOutputStream crcBuffer;
|
private ByteArrayOutputStream crcBuffer;
|
||||||
|
|
||||||
private Boolean userIdentified = false;
|
|
||||||
private Boolean connected = true;
|
|
||||||
private Boolean updateClient = true;
|
private Boolean updateClient = true;
|
||||||
// private Boolean initialisedRace = true;
|
// private Boolean initialisedRace = true;
|
||||||
|
|
||||||
@@ -70,6 +74,8 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
|
|
||||||
private XMLGenerator xml;
|
private XMLGenerator xml;
|
||||||
|
|
||||||
|
private List<ConnectionListener> connectionListeners = new ArrayList<>();
|
||||||
|
|
||||||
public ServerToClientThread(Socket socket) {
|
public ServerToClientThread(Socket socket) {
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
seqNo = 0;
|
seqNo = 0;
|
||||||
@@ -85,7 +91,7 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpYacht(){
|
private void setUpPlayer(){
|
||||||
BufferedReader fn;
|
BufferedReader fn;
|
||||||
String fName = "";
|
String fName = "";
|
||||||
BufferedReader ln;
|
BufferedReader ln;
|
||||||
@@ -114,7 +120,6 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
Yacht yacht = new Yacht(
|
Yacht yacht = new Yacht(
|
||||||
"Yacht", sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ"
|
"Yacht", sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ"
|
||||||
);
|
);
|
||||||
|
|
||||||
GameState.addYacht(sourceId, yacht);
|
GameState.addYacht(sourceId, yacht);
|
||||||
GameState.addPlayer(new Player(socket, yacht));
|
GameState.addPlayer(new Player(socket, yacht));
|
||||||
}
|
}
|
||||||
@@ -126,11 +131,6 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(Observable o, Object arg) {
|
|
||||||
sendSetupMessages();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void completeRegistration(ClientType clientType) throws IOException {
|
private void completeRegistration(ClientType clientType) throws IOException {
|
||||||
// Fail if not a player
|
// Fail if not a player
|
||||||
if (!clientType.equals(ClientType.PLAYER)){
|
if (!clientType.equals(ClientType.PLAYER)){
|
||||||
@@ -150,12 +150,14 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
|
|
||||||
this.clientType = clientType;
|
this.clientType = clientType;
|
||||||
this.sourceId = sourceId;
|
this.sourceId = sourceId;
|
||||||
setUpYacht();
|
|
||||||
|
|
||||||
isRegistered = true;
|
isRegistered = true;
|
||||||
os.write(responseMessage.getBuffer());
|
os.write(responseMessage.getBuffer());
|
||||||
sendSetupMessages();
|
|
||||||
|
|
||||||
|
setUpPlayer();
|
||||||
|
|
||||||
|
for (ConnectionListener listener : connectionListeners) {
|
||||||
|
listener.notifyConnection();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -226,7 +228,7 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendSetupMessages() {
|
public void sendSetupMessages() {
|
||||||
xml = new XMLGenerator();
|
xml = new XMLGenerator();
|
||||||
Race race = new Race();
|
Race race = new Race();
|
||||||
|
|
||||||
@@ -257,22 +259,6 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
updateClient = true;
|
updateClient = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tries to confirm the connection just accepted.
|
|
||||||
* Sends ID, expects that ID echoed for confirmation,
|
|
||||||
* if so, sends a confirmation packet back to that connection
|
|
||||||
* Creates a player instance with that ID and this thread and adds it to the GameState
|
|
||||||
* If not, close the socket and end the threads execution
|
|
||||||
*
|
|
||||||
* @param id the id to try and assign to the connection
|
|
||||||
* @return A boolean indicating if it was a successful handshake
|
|
||||||
*/
|
|
||||||
private Boolean threeWayHandshake(Integer id) {
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void closeSocket() {
|
private void closeSocket() {
|
||||||
try {
|
try {
|
||||||
socket.close();
|
socket.close();
|
||||||
@@ -281,7 +267,6 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private int readByte() throws Exception {
|
private int readByte() throws Exception {
|
||||||
int currentByte = -1;
|
int currentByte = -1;
|
||||||
try {
|
try {
|
||||||
@@ -353,7 +338,6 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
public void sendRaceStatusMessage() {
|
public void sendRaceStatusMessage() {
|
||||||
// variables taken from GameServerThread
|
// variables taken from GameServerThread
|
||||||
|
|
||||||
|
|
||||||
List<BoatSubMessage> boatSubMessages = new ArrayList<>();
|
List<BoatSubMessage> boatSubMessages = new ArrayList<>();
|
||||||
BoatStatus boatStatus;
|
BoatStatus boatStatus;
|
||||||
RaceStatus raceStatus;
|
RaceStatus raceStatus;
|
||||||
@@ -388,4 +372,12 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
public Socket getSocket() {
|
public Socket getSocket() {
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addConnectionListener(ConnectionListener listener) {
|
||||||
|
connectionListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeConnectionListener(ConnectionListener listener) {
|
||||||
|
connectionListeners.remove(listener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -450,9 +450,9 @@ public class Yacht {
|
|||||||
private void turnTowardsHeading(Double newHeading) {
|
private void turnTowardsHeading(Double newHeading) {
|
||||||
Double newVal = heading - newHeading;
|
Double newVal = heading - newHeading;
|
||||||
if (Math.floorMod(newVal.longValue(), 360L) > 180) {
|
if (Math.floorMod(newVal.longValue(), 360L) > 180) {
|
||||||
adjustHeading(TURN_STEP);
|
adjustHeading(TURN_STEP / 5);
|
||||||
} else {
|
} else {
|
||||||
adjustHeading(-TURN_STEP);
|
adjustHeading(-TURN_STEP / 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public class GameClient {
|
|||||||
private ObservableList<String> clientLobbyList = FXCollections.observableArrayList();
|
private ObservableList<String> clientLobbyList = FXCollections.observableArrayList();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an instance of the game client. Does not do anything untill run with runAsClient()
|
* Create an instance of the game client. Does not do anything until run with runAsClient()
|
||||||
* runAsHost().
|
* runAsHost().
|
||||||
* @param holder The JavaFX Pane that the visual elements for the race will be inserted into.
|
* @param holder The JavaFX Pane that the visual elements for the race will be inserted into.
|
||||||
*/
|
*/
|
||||||
@@ -106,10 +106,8 @@ public class GameClient {
|
|||||||
|
|
||||||
private void loadStartScreen() {
|
private void loadStartScreen() {
|
||||||
socketThread.setSocketToClose();
|
socketThread.setSocketToClose();
|
||||||
socketThread = null;
|
|
||||||
if (server != null) {
|
if (server != null) {
|
||||||
// TODO: 26/07/17 cir27 - handle disconnecting
|
server.terminate();
|
||||||
// server.shutDown();
|
|
||||||
server = null;
|
server = null;
|
||||||
}
|
}
|
||||||
FXMLLoader fxmlLoader = new FXMLLoader(
|
FXMLLoader fxmlLoader = new FXMLLoader(
|
||||||
@@ -191,9 +189,9 @@ public class GameClient {
|
|||||||
StreamParser.extractXmlMessage(packet)
|
StreamParser.extractXmlMessage(packet)
|
||||||
);
|
);
|
||||||
clientLobbyList.clear();
|
clientLobbyList.clear();
|
||||||
allBoatsMap.forEach((id, boat) -> {
|
allBoatsMap.forEach((id, boat) ->
|
||||||
clientLobbyList.add(id + " " + boat.getBoatName());
|
clientLobbyList.add(id + " " + boat.getBoatName())
|
||||||
});
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RACE_START_STATUS:
|
case RACE_START_STATUS:
|
||||||
|
|||||||
Reference in New Issue
Block a user