From 7601496e40665607c21d586a1adcf5fb72a87758 Mon Sep 17 00:00:00 2001 From: MickWerf Date: Mon, 18 May 2020 15:04:22 +0200 Subject: [PATCH] Added Data parser call to the ServerClient class. Added comments, helper functions and finished the framework of the SessionController. --- .../netwerkprog/game/server/ServerClient.java | 9 +- .../server/controllers/SessionController.java | 165 ++++++++++-------- 2 files changed, 101 insertions(+), 73 deletions(-) diff --git a/core/src/netwerkprog/game/server/ServerClient.java b/core/src/netwerkprog/game/server/ServerClient.java index 24d101e..e1bc642 100644 --- a/core/src/netwerkprog/game/server/ServerClient.java +++ b/core/src/netwerkprog/game/server/ServerClient.java @@ -1,6 +1,7 @@ package netwerkprog.game.server; import netwerkprog.game.server.controllers.SessionController; +import netwerkprog.game.server.data.Data; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -50,12 +51,14 @@ public class ServerClient implements Runnable { while (isConnected) { try { String received = this.in.readUTF(); - if (received.equals("\\quit")) { - isConnected = false; + Data data = server.parseData(received); + if (data.toString().equals("\\quit")) { + this.isConnected = false; this.server.removeClient(this); } else { - this.server.sendToEveryoneExcept(this.name,"<" + this.name + "> : " + received); + this.out.writeUTF(data.toString()); } + } catch (IOException e) { System.out.println("[SERVERCLIENT] caught exception - " + e.getMessage()); System.out.println("[SERVERCLIENT] terminating failing connection..."); diff --git a/core/src/netwerkprog/game/server/controllers/SessionController.java b/core/src/netwerkprog/game/server/controllers/SessionController.java index 8e43ba2..f82356c 100644 --- a/core/src/netwerkprog/game/server/controllers/SessionController.java +++ b/core/src/netwerkprog/game/server/controllers/SessionController.java @@ -6,70 +6,104 @@ import netwerkprog.game.server.data.DataParser; import netwerkprog.game.util.Controller; import netwerkprog.game.util.ServerData; +import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; +import java.util.Set; +/** + * The sessionController manages any connections from new clients and assigns individual threads to said clients. + */ public class SessionController extends Controller { - private ServerSocket serverSocket; - private DataParser parser; - private ArrayList clients = new ArrayList<>(); - private HashMap clientThreads = new HashMap<>(); + private final DataParser parser; + private final ArrayList clients = new ArrayList<>(); + private final HashMap clientThreads = new HashMap<>(); private boolean listening; public SessionController() { + this.parser = new DataParser(); this.listening = true; } -// public void connect() { -// try { -// this.serverSocket = new ServerSocket(ServerData.port()); -// System.out.println("[SERVER] listening on port " + ServerData.port()); -// Socket socket = serverSocket.accept(); -// -// System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress()); -// DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); -// DataInputStream inputStream = new DataInputStream(socket.getInputStream()); -// -// outputStream.writeUTF("Enter username: "); -// String username = inputStream.readUTF(); -// -// System.out.println("[SERVER] got username " + username); -// ServerClient serverClient = new ServerClient(username, socket, this); -// -// Thread t = new Thread(serverClient); -// t.start(); -// -// clientThreads.put(username, t); -// this.clients.add(serverClient); -// -// sendMessage(username, "--- Welcome! ---\nPeople online : " + clients.size()); -// -// clients.forEach(yeet -> sendToEveryoneExcept(username, username + " joined the server! [" + socket.getInetAddress().getHostAddress() + "]")); -// -// -// this.serverSocket.close(); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } + /** + * Thread run method. + */ + @Override + public void run() { + while (listening) { + listen(); + } + } - public void sendToEveryone(String text) { + /** + * Listens for any new clients. + */ + public void listen() { + try { + ServerSocket serverSocket = new ServerSocket(ServerData.port()); + System.out.println("[SERVER] listening on port " + ServerData.port()); + registerClient(serverSocket.accept()); + serverSocket.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + /** + * Registers a client to the server. + * @param socket The socket used for the client connections. + */ + public void registerClient(Socket socket) { + try { + System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress()); + DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); + DataInputStream inputStream = new DataInputStream(socket.getInputStream()); + + outputStream.writeUTF("Enter username: "); + String username = inputStream.readUTF(); + + System.out.println("[SERVER] got username " + username); + ServerClient serverClient = new ServerClient(username, socket, this); + + Thread t = new Thread(serverClient); + t.start(); + + this.clientThreads.put(username,t); + this.clients.add(serverClient); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + /** + * Parses the request to the requested Data. + * @param request The request to parse. + * @return Parsed Data. + */ + public Data parseData(String request) { + return this.parser.parse(request); + } + + /** + * Sends a server message to all connected clients. + * @param text message. + */ + public void serverMessage(String text) { for (ServerClient serverClient : clients) { serverClient.writeUTF(text); } } - public void sendToEveryoneExcept(String name, String text) { - for (ServerClient serverClient : clients) { - if (!serverClient.getName().equals(name)) - serverClient.writeUTF(text); - } - } - - public void sendMessage(String name, String text) { + /** + * Sends a message to a specific user. + * @param name user. + * @param text message. + */ + public void personalMessage(String name, String text) { for (ServerClient serverClient : clients) { if (serverClient.getName().equals(name)) { serverClient.writeUTF(text); @@ -78,6 +112,10 @@ public class SessionController extends Controller { } } + /** + * Removes a client from the server. + * @param serverClient The client to remove. + */ public void removeClient(ServerClient serverClient) { this.clients.remove(serverClient); try { @@ -86,34 +124,21 @@ public class SessionController extends Controller { e.printStackTrace(); } this.clientThreads.remove(serverClient.getName()); - this.sendToEveryone(serverClient.getName() + " left!"); + this.serverMessage(serverClient.getName() + " left!"); } - @Override - public void run() { - while (listening) { - listen(); - } + /** + * Gets a list of all connected users. + * @return Set of all connected users. + */ + public Set getUsernames() { + return this.clientThreads.keySet(); } - public void listen() { - try { - this.serverSocket = new ServerSocket(ServerData.port()); - System.out.println("[SERVER] listening on port " + ServerData.port()); - Socket socket = serverSocket.accept(); - this.serverSocket.close(); - - } catch (IOException ex) { - ex.printStackTrace(); - } - } - - //will most likely be removed. - public void parseData(String request) { - Data data = this.parser.parse(request); - } - - public void sendData(Data data) { - + /** + * Shuts down the sessionController. + */ + public void shutdown() { + this.listening = false; } }