From 4a616ef007a54e5796e8f1ebe9fc7cc143d5e861 Mon Sep 17 00:00:00 2001 From: emad Date: Sun, 7 Jun 2026 19:46:31 +0430 Subject: [PATCH 1/2] implement all TODOs --- src/main/java/chat/ChatClient.java | 20 ++++++++++++++++++++ src/main/java/chat/ChatServer.java | 13 +++++++++++++ src/main/java/chat/ClientHandler.java | 2 +- src/main/java/chat/MessageListener.java | 10 ++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/chat/ChatClient.java b/src/main/java/chat/ChatClient.java index eb20460..0dde8bd 100644 --- a/src/main/java/chat/ChatClient.java +++ b/src/main/java/chat/ChatClient.java @@ -38,18 +38,38 @@ public class ChatClient { private void connectToServer() throws IOException { // TODO: create socket connection to host:port + Socket socket1 = new Socket(host, port); // TODO: initialize output stream (PrintWriter) + out = new PrintWriter(socket1.getOutputStream(), true); // TODO: initialize input stream (BufferedReader) + in = new BufferedReader(new InputStreamReader(socket1.getInputStream())); } private void readUserInputAndSend() throws IOException { // TODO: read continuously from console // TODO: send each input line to server +// while (true){ +// String message = in.readLine(); +// out.println(message); +// } + String userInput; + while ((userInput = consoleReader.readLine()) != null) + { + out.println(userInput); + } } private void cleanup() { // TODO: close socket safely // TODO: release resources + try { + if(socket != null && !socket.isClosed()) + { + socket.close(); + } + }catch (IOException e){ + System.err.println("Error closing client: " + e.getMessage()); + } } public static void main(String[] args) { diff --git a/src/main/java/chat/ChatServer.java b/src/main/java/chat/ChatServer.java index 218dbcd..80fe786 100644 --- a/src/main/java/chat/ChatServer.java +++ b/src/main/java/chat/ChatServer.java @@ -42,17 +42,30 @@ public class ChatServer { // step 1: iterate through connectedClients safely // step 2: skip the sender client // step 3: send message to remaining clients using sendMessage + for(ClientHandler client: connectedClients) + { + if(!client.getUsername().equals(sender.getUsername())) + { + client.sendMessage(message); + } + } } public void broadcastSystemMessage(String message) { // step 1: iterate through all connected clients // step 2: send system message to each client + for(ClientHandler client: connectedClients) + { + client.sendMessage(message); + } } public void removeClient(ClientHandler clientHandler) { // step 1: remove client from connectedClients set // step 2: retrieve username from clientHandler // step 3: broadcast system message about user leaving + connectedClients.remove(clientHandler); + broadcastSystemMessage(clientHandler.getUsername() + " left"); } public static void main(String[] args) { diff --git a/src/main/java/chat/ClientHandler.java b/src/main/java/chat/ClientHandler.java index 04484ba..cd427b6 100644 --- a/src/main/java/chat/ClientHandler.java +++ b/src/main/java/chat/ClientHandler.java @@ -39,7 +39,7 @@ public class ClientHandler implements Runnable { } private void requestUsername() throws IOException { - out.println("Enter your username:"); + out.println("Enter your username: "); username = in.readLine(); if (username == null || username.trim().isEmpty()) { username = "Anonymous"; diff --git a/src/main/java/chat/MessageListener.java b/src/main/java/chat/MessageListener.java index 246256b..1cbdda2 100644 --- a/src/main/java/chat/MessageListener.java +++ b/src/main/java/chat/MessageListener.java @@ -15,5 +15,15 @@ public class MessageListener implements Runnable { public void run() { // TODO: continuously read messages from server // TODO: print received messages immediately + try { + String message; + while ((message = inputReader.readLine()) != null) + { + System.out.println(message); + } + + } catch (IOException e) { + throw new RuntimeException(e); + } } } -- 2.54.0 From 53e40ca2f5f1a51958e2bf2103b0ceb93a0da55f Mon Sep 17 00:00:00 2001 From: emad Date: Sun, 7 Jun 2026 20:20:49 +0430 Subject: [PATCH 2/2] implementation --- src/main/java/chat/ChatServer.java | 19 ++++++++++--------- src/main/java/chat/MessageListener.java | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/chat/ChatServer.java b/src/main/java/chat/ChatServer.java index 80fe786..d9620d1 100644 --- a/src/main/java/chat/ChatServer.java +++ b/src/main/java/chat/ChatServer.java @@ -42,11 +42,11 @@ public class ChatServer { // step 1: iterate through connectedClients safely // step 2: skip the sender client // step 3: send message to remaining clients using sendMessage - for(ClientHandler client: connectedClients) - { - if(!client.getUsername().equals(sender.getUsername())) - { - client.sendMessage(message); + synchronized (connectedClients) { + for (ClientHandler client : connectedClients) { + if (client != sender) { + client.sendMessage(message); + } } } } @@ -54,9 +54,10 @@ public class ChatServer { public void broadcastSystemMessage(String message) { // step 1: iterate through all connected clients // step 2: send system message to each client - for(ClientHandler client: connectedClients) - { - client.sendMessage(message); + synchronized (connectedClients) { + for (ClientHandler client : connectedClients) { + client.sendMessage(message); + } } } @@ -65,7 +66,7 @@ public class ChatServer { // step 2: retrieve username from clientHandler // step 3: broadcast system message about user leaving connectedClients.remove(clientHandler); - broadcastSystemMessage(clientHandler.getUsername() + " left"); + broadcastSystemMessage("[System] " + clientHandler.getUsername() + " left the chat"); } public static void main(String[] args) { diff --git a/src/main/java/chat/MessageListener.java b/src/main/java/chat/MessageListener.java index 1cbdda2..609615d 100644 --- a/src/main/java/chat/MessageListener.java +++ b/src/main/java/chat/MessageListener.java @@ -23,7 +23,7 @@ public class MessageListener implements Runnable { } } catch (IOException e) { - throw new RuntimeException(e); + System.err.println(e.getMessage()); } } } -- 2.54.0