From 5f01e494f40d5ce930403a9d91458c6fddbb085d Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Mon, 21 Mar 2022 22:44:29 +0100 Subject: [PATCH] Client Server w/ Group-Chat. --- .../dbis/cs108/Multiplayer/Client/Client.java | 96 +++++++++++++++++++ .../Multiplayer/Client/ClientThread.java | 29 ------ .../dbis/cs108/Multiplayer/Server/Chat.java | 4 + .../Multiplayer/Server/ClientHandler.java | 84 +++++++++++++++- .../dbis/cs108/Multiplayer/Server/Server.java | 52 ++++++++-- 5 files changed, 226 insertions(+), 39 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/Client.java delete mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/ClientThread.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Server/Chat.java 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 new file mode 100644 index 0000000..12d38a0 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/Client.java @@ -0,0 +1,96 @@ +package ch.unibas.dmi.dbis.cs108.Multiplayer.Client; + +import java.net.Socket; +import java.io.*; +import java.util.Scanner; + +public class Client { + + private Socket socket; + private BufferedReader in; + private BufferedWriter out; + public String userName; + + public Client(Socket socket, String userName) { + try { + this.socket = socket; + this.out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + this.in = new BufferedReader((new InputStreamReader((socket.getInputStream())))); + this.userName = userName; + } catch (IOException e) { + e.printStackTrace(); + closeEverything(socket, in, out); + } + } + + public void sendMessage() { + try { + out.write(userName); + out.newLine(); + out.flush(); + + Scanner sc = new Scanner(System.in); + while (socket.isConnected()) { + String msg = sc.nextLine(); + out.write(userName + ": " + msg); + out.newLine(); + out.flush(); + } + } catch (IOException e) { + e.printStackTrace(); + closeEverything(socket, in, out); + } + } + + public void chatListener() { + new Thread(new Runnable() { + @Override + public void run() { + String chatMsg; + + while(socket.isConnected()) { + try { + chatMsg = in.readLine(); + System.out.println(chatMsg); + } catch (IOException e) { + e.printStackTrace(); + closeEverything(socket, in, out); + } + + } + } + }).start(); + } + + public void closeEverything(Socket socket, BufferedReader in, BufferedWriter out) { + try { + if (in != null) { + in.close(); + } + if (out != null) { + out.close(); + } + if (socket != null) { + socket.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + System.out.println("Choose a nickname: "); + String username = sc.next(); + Socket socket; + try { + socket = new Socket("localhost", 42069); + Client client = new Client(socket, username); + client.chatListener(); + client.sendMessage(); + } catch (IOException e) { + e.printStackTrace(); + } + + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/ClientThread.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/ClientThread.java deleted file mode 100644 index a2f22dd..0000000 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/ClientThread.java +++ /dev/null @@ -1,29 +0,0 @@ -package ch.unibas.dmi.dbis.cs108.Multiplayer.Client; - -import java.io.*; -import java.net.Socket; - -public class ClientThread implements Runnable { - private int name; - private final Socket socket; - - public ClientThread(int name, Socket socket) { - this.name = name; - this.socket = socket; - } - @Override - public void run() { - try { - BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); - BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); - while(socket.isConnected()){ - - } - } catch (IOException e) { - e.printStackTrace(); - } - - - - } -} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Server/Chat.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Server/Chat.java new file mode 100644 index 0000000..5305f37 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Server/Chat.java @@ -0,0 +1,4 @@ +package ch.unibas.dmi.dbis.cs108.Multiplayer.Server; + +public class Chat { +} 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 d130358..580c99f 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 @@ -1,4 +1,86 @@ package ch.unibas.dmi.dbis.cs108.Multiplayer.Server; -public class ClientHandler { +import java.io.*; +import java.net.Socket; +import java.util.HashSet; +import java.util.Scanner; + +public class ClientHandler implements Runnable{ + private String clientUserName; + private BufferedWriter out; + private BufferedReader in; + private Socket socket; + Scanner sc; + public static HashSet clientHandlers = new HashSet<>(); + + public ClientHandler(Socket socket) { + try { + this.socket = socket; + this.out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + this.in = new BufferedReader((new InputStreamReader((socket.getInputStream())))); + this.clientUserName = in.readLine(); + clientHandlers.add(this); + broadcastMessage("SERVER: " + clientUserName + " has joined the Server"); + } catch (IOException e) { + e.printStackTrace(); + closeEverything(socket, in, out); + } + } + + @Override + public void run() { + String msg; + + while(socket.isConnected()) { + try { + msg = in.readLine(); + broadcastMessage(msg); + } catch (IOException e) { + e.printStackTrace(); + closeEverything(socket, in, out); + break; + } + } + } + + public void broadcastMessage(String msg) { + for (ClientHandler client : clientHandlers) { + try { + if(!client.clientUserName.equals((clientUserName))) { + client.out.write(msg); + client.out.newLine(); + client.out.flush(); + } else { + client.out.write("Message +" + msg + "* sent!"); + client.out.newLine(); + client.out.flush(); + } + } catch (IOException e) { + e.printStackTrace(); + closeEverything(socket, in ,out); + } + } + } + + public void removeClientHandler() { + clientHandlers.remove(this); + broadcastMessage("SERVER: " + clientUserName + " has left the server"); + } + + public void closeEverything(Socket socket, BufferedReader in, BufferedWriter out) { + removeClientHandler(); + try { + if (in != null) { + in.close(); + } + if (out != null) { + out.close(); + } + if (socket != null) { + socket.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } } 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 64a9943..4bf8fb9 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 @@ -1,27 +1,61 @@ package ch.unibas.dmi.dbis.cs108.Multiplayer.Server; -import java.io.IOException; +import ch.unibas.dmi.dbis.cs108.Multiplayer.Client.Client; + +import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; +import java.util.HashSet; public class Server { private static final int gamePort = 42069; - private static int clientIndex = 0; - private HashMap nameToIndex = new HashMap<>(); - private HashMap indexToHandler = new HashMap<>(); + private ServerSocket serverSocket; - public static void main(String[] args) { + public Server(ServerSocket serverSocket) { + this.serverSocket = serverSocket; + } + public void startServer() { try { - ServerSocket gameServer = new ServerSocket(gamePort); - System.out.println("Waiting for a connection on Port 42069"); - while(true) { - Socket client = gameServer.accept(); + + + while (true) { + Socket socket = serverSocket.accept(); + System.out.println("Port 42069 open on "); + ClientHandler nextClient = new ClientHandler(socket); + + Thread th = new Thread(nextClient); + } + } catch (IOException e) { + e.printStackTrace(); + + } + } + + public void closeServerSocket() { + try { + if (serverSocket != null){ + serverSocket.close(); } } catch (IOException e) { e.printStackTrace(); } } + + public static void main(String[] args) { + ServerSocket serverSocket = null; + try { + serverSocket = new ServerSocket(gamePort); + } catch (IOException e) { + e.printStackTrace(); + } + Server server = new Server(serverSocket); + server.startServer(); + } + + public static void broadcast(String msg){ + //TODO + } }