From 8f00f3a80c8840d0ace62c60b201ce650efa611e Mon Sep 17 00:00:00 2001 From: William Muir Date: Thu, 20 Jul 2017 11:22:30 +1200 Subject: [PATCH] Refactoring for server package, Changed GameServerThread to MainServerThread. All Server classes now in single gameServer package tags: #story[1055] --- .../seng302/controllers/LobbyController.java | 9 - .../controllers/StartScreenController.java | 4 +- .../gameServer/ClientConnectionDelegate.java | 4 +- .../seng302/gameServer/GameServerThread.java | 368 ------------------ .../seng302/gameServer/HeartbeatThread.java | 16 +- .../MainServerThread.java | 63 ++- .../gameServer/ServerListenThread.java | 17 +- .../ServerToClientThread.java | 17 +- src/main/java/seng302/models/Player.java | 24 +- 9 files changed, 85 insertions(+), 437 deletions(-) delete mode 100644 src/main/java/seng302/gameServer/GameServerThread.java rename src/main/java/seng302/{gameServerWithThreading => gameServer}/MainServerThread.java (65%) rename src/main/java/seng302/{gameServerWithThreading => gameServer}/ServerToClientThread.java (92%) diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index 4f2b9584..d28e7de9 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -2,13 +2,10 @@ package seng302.controllers; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; import javafx.scene.text.Text; -import seng302.gameServer.GameServerThread; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; @@ -25,8 +22,6 @@ public class LobbyController { @FXML private Text lobbyIpText; - private GameServerThread gameServerThread; - private void setContentPane(String jfxUrl) { try { AnchorPane contentPane = (AnchorPane) lobbyScreen.getParent(); @@ -49,7 +44,6 @@ public class LobbyController { setContentPane("/views/StartScreenView.fxml"); System.out.println("Leaving lobby!"); GameState.setCurrentStage(GameStages.CANCELLED); - gameServerThread.terminateGame(); } @@ -58,7 +52,4 @@ public class LobbyController { GameState.setCurrentStage(GameStages.RACING); } - protected void setGameServerThread(GameServerThread gameServerThread) { - this.gameServerThread = gameServerThread; - } } diff --git a/src/main/java/seng302/controllers/StartScreenController.java b/src/main/java/seng302/controllers/StartScreenController.java index 738377a4..d1dd5684 100644 --- a/src/main/java/seng302/controllers/StartScreenController.java +++ b/src/main/java/seng302/controllers/StartScreenController.java @@ -8,8 +8,7 @@ import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; import seng302.client.ClientToServerThread; import seng302.gameServer.GameState; -import seng302.gameServerWithThreading.MainServerThread; -import seng302.models.stream.StreamReceiver; +import seng302.gameServer.MainServerThread; import java.io.IOException; import java.net.InetAddress; @@ -64,7 +63,6 @@ public class StartScreenController { String ipAddress = InetAddress.getLocalHost().getHostAddress(); new GameState(ipAddress); new MainServerThread().start(); -// new GameServerThread("Fuck you"); // get the lobby controller so that we can pass the game server thread to it setContentPane("/views/LobbyView.fxml"); diff --git a/src/main/java/seng302/gameServer/ClientConnectionDelegate.java b/src/main/java/seng302/gameServer/ClientConnectionDelegate.java index 35d839bc..fab71cd7 100644 --- a/src/main/java/seng302/gameServer/ClientConnectionDelegate.java +++ b/src/main/java/seng302/gameServer/ClientConnectionDelegate.java @@ -5,9 +5,9 @@ import seng302.models.Player; public interface ClientConnectionDelegate { /** * 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 diff --git a/src/main/java/seng302/gameServer/GameServerThread.java b/src/main/java/seng302/gameServer/GameServerThread.java deleted file mode 100644 index 9f127773..00000000 --- a/src/main/java/seng302/gameServer/GameServerThread.java +++ /dev/null @@ -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 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) 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) 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(); - } - } -} diff --git a/src/main/java/seng302/gameServer/HeartbeatThread.java b/src/main/java/seng302/gameServer/HeartbeatThread.java index b5ac550e..837677bd 100644 --- a/src/main/java/seng302/gameServer/HeartbeatThread.java +++ b/src/main/java/seng302/gameServer/HeartbeatThread.java @@ -18,7 +18,7 @@ public class HeartbeatThread extends Thread{ private Integer seqNum; private Stack disconnectedPlayers; - HeartbeatThread(ClientConnectionDelegate delegate){ + public HeartbeatThread(ClientConnectionDelegate delegate){ this.delegate = delegate; seqNum = 0; disconnectedPlayers = new Stack<>(); @@ -43,15 +43,15 @@ public class HeartbeatThread extends Thread{ Message heartbeat = new Heartbeat(seqNum); 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); } -// -// try { -// player.getSocketChannel().socket().getOutputStream().write(heartbeat.getBuffer()); -// } catch (IOException e) { -// playerLostConnection(player); -// } } updateDelegate(); diff --git a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java similarity index 65% rename from src/main/java/seng302/gameServerWithThreading/MainServerThread.java rename to src/main/java/seng302/gameServer/MainServerThread.java index 226e1dc8..003f98ba 100644 --- a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -1,7 +1,6 @@ -package seng302.gameServerWithThreading; +package seng302.gameServer; -import seng302.gameServer.GameStages; -import seng302.gameServer.GameState; +import seng302.models.Player; import seng302.models.stream.PacketBufferDelegate; import seng302.models.stream.StreamParser; 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 * 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 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 Socket socket; @@ -40,6 +40,15 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ 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. while (!isInterrupted()) { try { @@ -48,21 +57,9 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ 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 - else if (GameState.getCurrentStage() == GameStages.RACING) { + if (GameState.getCurrentStage() == GameStages.RACING) { } @@ -97,15 +94,45 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ } } + public void updateClients() { for (ServerToClientThread serverToClientThread : serverToClientThreads) { serverToClientThread.updateClient(); } } + + static void serverLog(String message, int logLevel){ + if(logLevel <= LOG_LEVEL){ + System.out.println("[SERVER] " + message); + } + } + @Override public boolean addToBuffer(StreamPacket streamPacket) { System.out.println("HEY HI"); 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(); + } } diff --git a/src/main/java/seng302/gameServer/ServerListenThread.java b/src/main/java/seng302/gameServer/ServerListenThread.java index cfcbdcaa..b734ab8c 100644 --- a/src/main/java/seng302/gameServer/ServerListenThread.java +++ b/src/main/java/seng302/gameServer/ServerListenThread.java @@ -3,6 +3,8 @@ package seng302.gameServer; import seng302.models.Player; import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; @@ -11,11 +13,11 @@ import java.nio.channels.SocketChannel; * Created by wmu16 on 11/07/17. */ public class ServerListenThread extends Thread{ - private ServerSocketChannel socketChannel; + private ServerSocket serverSocket; private ClientConnectionDelegate delegate; - ServerListenThread(ServerSocketChannel socketChannel, ClientConnectionDelegate delegate){ - this.socketChannel = socketChannel; + public ServerListenThread(ServerSocket serverSocket, ClientConnectionDelegate delegate){ + this.serverSocket = serverSocket; this.delegate = delegate; } @@ -24,10 +26,11 @@ public class ServerListenThread extends Thread{ */ private void acceptConnection() { try { - SocketChannel thisClient = socketChannel.accept(); - if (thisClient.socket() != null){ - Player thisPlayer = new Player(thisClient); - delegate.clientConnected(thisPlayer); + Socket thisClient = serverSocket.accept(); + if (thisClient != null){ + ServerToClientThread thisConnection = new ServerToClientThread(thisClient); + thisConnection.start(); + delegate.clientConnected(thisConnection); } } catch (IOException e) { e.getMessage(); diff --git a/src/main/java/seng302/gameServerWithThreading/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java similarity index 92% rename from src/main/java/seng302/gameServerWithThreading/ServerToClientThread.java rename to src/main/java/seng302/gameServer/ServerToClientThread.java index 957cf043..7198875c 100644 --- a/src/main/java/seng302/gameServerWithThreading/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -1,4 +1,4 @@ -package seng302.gameServerWithThreading; +package seng302.gameServer; import seng302.gameServer.GameState; import seng302.models.Player; @@ -27,13 +27,11 @@ public class ServerToClientThread extends Thread { private ByteArrayOutputStream crcBuffer; - private final PacketBufferDelegate packetBufferDelegate; - private Boolean userIdentified = false; private Boolean connected = true; private Boolean updateClient = true; - public ServerToClientThread(Socket socket, PacketBufferDelegate packetBufferDelegate) { + public ServerToClientThread(Socket socket) { this.socket = socket; try { is = socket.getInputStream(); @@ -41,17 +39,17 @@ public class ServerToClientThread extends Thread { } catch (IOException e) { System.out.println("IO error in server thread upon grabbing streams"); } - this.packetBufferDelegate = packetBufferDelegate; - // threeWayHandshake(); - GameState.addPlayer(new Player(socket.getChannel())); +// threeWayHandshake(); + GameState.addPlayer(new Player(socket)); } public void run() { - int sync1; int sync2; // TODO: 14/07/17 wmu16 - Work out how to fix this while loop while(true) { + //System.out.print("."); + try { //Perform a write if it is time to as delegated by the MainServerThread if (updateClient) { @@ -80,9 +78,9 @@ public class ServerToClientThread extends Thread { long computedCrc = checksum.getValue(); long packetCrc = Message.bytesToLong(getBytes(4)); if (computedCrc == packetCrc) { + //System.out.println("RECEIVED A PACKET"); 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!?!? -// packetBufferDelegate.addToBuffer(new StreamPacket(type, payloadLength, timeStamp, payload)); } else { System.err.println("Packet has been dropped"); } @@ -139,6 +137,7 @@ public class ServerToClientThread extends Thread { private int readByte() throws Exception { int currentByte = -1; try { + // @TODO @FIX ConnectionReset Exception when a client disconnects before it is garbage collected currentByte = is.read(); crcBuffer.write(currentByte); } catch (IOException e) { diff --git a/src/main/java/seng302/models/Player.java b/src/main/java/seng302/models/Player.java index fb062d0d..5ea32a4e 100644 --- a/src/main/java/seng302/models/Player.java +++ b/src/main/java/seng302/models/Player.java @@ -3,6 +3,7 @@ package seng302.models; import javafx.scene.paint.Color; import java.io.IOException; +import java.net.Socket; import java.nio.channels.SocketChannel; /** @@ -11,17 +12,17 @@ import java.nio.channels.SocketChannel; */ public class Player { - private SocketChannel socketChannel; + private Socket socket; private Yacht yacht; private Integer lastMarkPassed; - public Player(SocketChannel socketChannel) { - this.socketChannel = socketChannel; + public Player(Socket socket) { + this.socket = socket; } - public SocketChannel getSocketChannel() { - return socketChannel; + public Socket getSocket() { + return socket; } public Integer getLastMarkPassed() { @@ -40,15 +41,12 @@ public class Player { public String toString() { String playerAddress = null; - if (socketChannel == null){ + if (socket == null){ return "Disconnected Player"; } - try { - playerAddress = socketChannel.getRemoteAddress().toString(); - } catch (IOException e) { - e.printStackTrace(); - } + playerAddress = socket.getRemoteSocketAddress().toString(); + return playerAddress; } @@ -63,11 +61,11 @@ public class Player { return false; } - return ((Player) obj).socketChannel.equals(socketChannel); + return ((Player) obj).socket.equals(socket); } @Override public int hashCode(){ - return socketChannel.hashCode(); + return socket.hashCode(); } }