diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index eab39d9a..961eb415 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -9,12 +9,12 @@ import java.util.Map; import java.util.Random; import java.util.Set; import javafx.scene.paint.Color; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.xml.sax.InputSource; -import seng302.gameServer.messages.*; -import seng302.model.*; import seng302.gameServer.messages.BoatAction; import seng302.gameServer.messages.BoatStatus; import seng302.gameServer.messages.ChatterMessage; @@ -38,10 +38,6 @@ import seng302.model.token.TokenType; import seng302.utilities.GeoUtility; import seng302.utilities.XMLParser; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import java.util.*; - /** * A Static class to hold information about the current state of the game (model) * Also contains logic for updating itself on regular time intervals on its own thread @@ -77,6 +73,7 @@ public class GameState implements Runnable { private static Double speedMultiplier = 1d; private static Boolean customizationFlag; // dirty flag to tell if a player has customized their boat. + private static Boolean playerHasLeftFlag; private static String hostIpAddress; private static List players; @@ -106,6 +103,7 @@ public class GameState implements Runnable { players = new ArrayList<>(); GameState.hostIpAddress = hostIpAddress; customizationFlag = false; + playerHasLeftFlag = false; speedMultiplier = 1.0; currentStage = GameStages.LOBBYING; isRaceStarted = false; @@ -839,6 +837,14 @@ public class GameState implements Runnable { customizationFlag = false; } + public static void setPlayerHasLeftFlag(Boolean flag) { + playerHasLeftFlag = flag; + } + + public static Boolean getPlayerHasLeftFlag() { + return playerHasLeftFlag; + } + public static Integer getNumberOfPlayers(){ Integer numPlayers = 1; diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index d15eea08..a5eef1f0 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -1,5 +1,15 @@ package seng302.gameServer; +import java.io.IOException; +import java.io.StringReader; +import java.net.ServerSocket; +import java.util.ArrayList; +import java.util.Random; +import java.util.Timer; +import java.util.TimerTask; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -16,17 +26,6 @@ import seng302.utilities.GeoUtility; import seng302.utilities.XMLGenerator; import seng302.utilities.XMLParser; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.io.StringReader; -import java.net.ServerSocket; -import java.util.ArrayList; -import java.util.Random; -import java.util.Timer; -import java.util.TimerTask; - /** * A class describing the overall server, which creates and collects server threads for each client * Created by wmu16 on 13/07/17. @@ -115,6 +114,20 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { //You should handle interrupts in some way, so that the thread won't keep on forever if you exit the app. while (!terminated) { + if (GameState.getPlayerHasLeftFlag()) { + for (ServerToClientThread stc : serverToClientThreads) { + if (!stc.isSocketOpen()) { + GameState.getYachts().remove(stc.getSourceId()); + sendSetupMessages(); + try { + stc.getSocket().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + GameState.setPlayerHasLeftFlag(false); + } try { Thread.sleep(1000 / CLIENT_UPDATES_PER_SECOND); } catch (InterruptedException e) { diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 4a2bd158..524944da 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -1,17 +1,12 @@ package seng302.gameServer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import seng302.gameServer.messages.*; -import seng302.model.Player; -import seng302.model.ServerYacht; -import seng302.model.stream.packets.PacketType; -import seng302.model.stream.packets.StreamPacket; -import seng302.model.stream.xml.generator.RaceXMLTemplate; -import seng302.utilities.XMLGenerator; - -import java.io.*; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; @@ -24,7 +19,6 @@ import java.util.zip.Checksum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import seng302.gameServer.messages.BoatAction; -import seng302.gameServer.messages.BoatLocationMessage; import seng302.gameServer.messages.ChatterMessage; import seng302.gameServer.messages.ClientType; import seng302.gameServer.messages.CustomizeRequestType; @@ -33,14 +27,11 @@ import seng302.gameServer.messages.RegistrationResponseMessage; import seng302.gameServer.messages.RegistrationResponseStatus; import seng302.gameServer.messages.XMLMessage; import seng302.gameServer.messages.XMLMessageSubType; -import seng302.gameServer.messages.YachtEventCodeMessage; import seng302.model.Player; import seng302.model.ServerYacht; import seng302.model.stream.packets.PacketType; import seng302.model.stream.packets.StreamPacket; import seng302.model.stream.xml.generator.RaceXMLTemplate; -import seng302.model.stream.xml.generator.RegattaXMLTemplate; -import seng302.model.token.Token; import seng302.utilities.XMLGenerator; /** @@ -104,6 +95,10 @@ public class ServerToClientThread implements Runnable { thread.start(); } + public Integer getSourceId() { + return sourceId; + } + private void setUpPlayer(){ BufferedReader fn; String fName = ""; @@ -228,9 +223,11 @@ public class ServerToClientThread implements Runnable { } } catch (Exception e) { closeSocket(); + GameState.setPlayerHasLeftFlag(true); return; } } + GameState.setPlayerHasLeftFlag(true); logger.warn("Closed serverToClientThread" + thread, 1); } @@ -264,6 +261,10 @@ public class ServerToClientThread implements Runnable { } } + public Boolean isSocketOpen() { + return !socket.isClosed(); + } + private int readByte() throws Exception { int currentByte = -1; try {