diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 3f07bfb..de54a56 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -61,7 +61,7 @@ public class Client { String formattedMSG = MessageFormatter.formatMsg(msg); sendMsgToServer(formattedMSG); } - Thread.sleep(20); + Thread.sleep(5); } catch (IOException | InterruptedException e) { e.printStackTrace(); } @@ -91,7 +91,8 @@ public class Client { parse(chatMsg); //todo: i think this trows an error BC chatMsg is null if client disconnects } } catch (IOException e) { - e.printStackTrace(); + //e.printStackTrace(); + LOGGER.debug("Exception while trying to read message"); } } @@ -111,7 +112,8 @@ public class Client { out.newLine(); out.flush(); } catch (IOException e) { - e.printStackTrace(); + //e.printStackTrace(); + LOGGER.debug("unable to send msg: " + msg); } } @@ -126,7 +128,6 @@ public class Client { } public void closeEverything() { - //TODO Correctly closing a clients connection try { if (in != null) { in.close(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/ServerPinger.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/ServerPinger.java index 058cf7c..c368038 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/ServerPinger.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/ServerPinger.java @@ -1,6 +1,7 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.helpers; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.multiplayer.server.ClientHandler; import java.io.BufferedWriter; import java.io.IOException; import java.net.Socket; @@ -19,19 +20,18 @@ public class ServerPinger implements Runnable { private boolean gotPingBack; //should be set to true (via setGotPingBack) as soon as the server gets a pingback. private boolean isConnected; //set to true unless the ServerPinger detects a connection loss. BufferedWriter out; //the output of this client through which the pings are sent + ClientHandler c; private Socket socket; /** * @param socket the socket the ClientHandler is connected to; used to end the thread if the - * connection is lost. - * - * @param out the output through which the pings are sent. + * connection is closed. */ - public ServerPinger(BufferedWriter out, Socket socket) { + public ServerPinger(Socket socket, ClientHandler c) { gotPingBack = false; isConnected = true; - this.out = out; this.socket = socket; + this.c = c; } @Override @@ -40,24 +40,22 @@ public class ServerPinger implements Runnable { Thread.sleep(2000); while (socket.isConnected() && !socket.isClosed()) { gotPingBack = false; - out.write("SPING"); //todo: throws exception when client disconnects. - out.newLine(); - out.flush(); + c.sendMsgToClient("SPING"); Thread.sleep(4000); if (gotPingBack) { if (!isConnected) { //if !isConnected, then the connection had been lost before. isConnected = true; - System.out.println("Connection regained!"); + System.out.println("Connection to user " + c.getClientUserName() + " regained!"); } } else { if (isConnected) { isConnected = false; - System.out.println("Lost connection. Waiting to reconnect..."); + System.out.println("Lost connection to user " + c.getClientUserName() + ". Waiting to reconnect..."); } } } isConnected = false; //in case the socket accidentally disconnects (can this happen?) - } catch (InterruptedException | IOException e) { + } catch (InterruptedException e) { e.printStackTrace(); } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java index 3110ecc..f08eec7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java @@ -34,18 +34,9 @@ public class ClientHandler implements Runnable { this.socket = socket; this.out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); this.in = new BufferedReader(new InputStreamReader((socket.getInputStream()))); - this.clientUserName = "Mysterious Passenger"; //todo: duplicate handling for this - /* - // todo: duplicate handling more elegantly - if (AllClientNames.allNames("").contains(clientUserName)) { - clientUserName = NameGenerator.randomName(clientUserName); - } - // add username to list of all client names for future duplicate checking - AllClientNames.allNames(clientUserName); - - */ + this.clientUserName = nameDuplicateChecker.singularName("U.N. Owen"); connectedClients.add(this); - serverPinger = new ServerPinger(out, socket); + serverPinger = new ServerPinger(socket, this); Thread sP = new Thread(serverPinger); sP.start(); } catch (IOException e) { @@ -94,7 +85,8 @@ public class ClientHandler implements Runnable { msg = in.readLine(); //todo: here is where the server throws an exception when the client quits JServerProtocolParser.parse(msg, this); } catch (IOException e) { - e.printStackTrace(); + //e.printStackTrace(); + LOGGER.debug("Exception while trying to read message"); break; } } @@ -129,7 +121,7 @@ public class ClientHandler implements Runnable { } /** - * Broadcasts a Message to all active clients in the form "Username: @msg" + * Broadcasts a chat Message to all active clients in the form "Username: @msg" * * @param msg the Message to be broadcast */ @@ -141,9 +133,9 @@ public class ClientHandler implements Runnable { /** * Broadcasts a non-chat Message to all active clients. This can be used for server - * messages / announcements rather than chat messages. The message will be printed to the user ex- - * actly as it is given to this method. Unlike broadcastChatMessage, it will also be printed onto - * the server console. + * messages / announcements rather than chat messages. The message will be printed to the user + * exactly as it is given to this method. Unlike broadcastChatMessage, it will also be printed + * onto the server console. * * @param msg the Message to be broadcast */ @@ -165,24 +157,19 @@ public class ClientHandler implements Runnable { out.newLine(); out.flush(); } catch (IOException e) { - e.printStackTrace(); + //e.printStackTrace(); + LOGGER.debug("unable to send msg: " + msg); } } - /** - * Does what it sounds like - */ - public void removeClientHandler() { - broadcastChatMessage("SERVER: " + clientUserName + " has left the server"); - connectedClients.remove(this); - } /** * Does exactly what it says on the tin, closes all connections of Client to Server. */ public void disconnectClient() { + broadcastAnnouncement(getClientUserName() + " has left the server."); sendMsgToClient("QUITC"); - removeClientHandler(); + connectedClients.remove(this); socket = this.getSocket(); in = this.getIn(); out = this.getOut(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java index 3ebb67e..91f99c7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java @@ -56,7 +56,6 @@ public class JServerProtocolParser { break; case "QUITS": //safely disconnects the user - h.broadcastAnnouncement(h.getClientUserName() + " has left the server."); h.disconnectClient(); break; default: diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java index 4fa9590..0b157da 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java @@ -27,7 +27,7 @@ public class Server { */ public void startServer() { try { - System.out.println("Port 42069 is open on " + this.serverSocket.getInetAddress()); + System.out.println("Port 42069 is open on " + this.serverSocket.getInetAddress()); //TODO: this is always 0.0.0.0 while (!serverSocket.isClosed()) { Socket socket = serverSocket.accept(); ClientHandler nextClient = new ClientHandler(socket); @@ -62,7 +62,4 @@ public class Server { server.startServer(); } - public static void broadcast(String msg) { - //TODO - } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/nameDuplicateChecker.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/nameDuplicateChecker.java index 4f31471..43c5956 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/nameDuplicateChecker.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/nameDuplicateChecker.java @@ -54,7 +54,7 @@ public class nameDuplicateChecker { public static String singularName(String name) { String rtrn = name; //if this line is used, only duplicate names get a suffix. //String rtrn = extendName(name); //if this line is used, all clients get a suffix - while (isTaken(rtrn)) { + while (isTaken(rtrn)) { //todo: handle the (very unlikely) case that all names are taken. rtrn = extendName(name); } return rtrn;