package chat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ClientHandler implements Runnable { private final Socket clientSocket; private final ChatServer chatServer; private PrintWriter out; private BufferedReader in; private String username; public ClientHandler(Socket clientSocket, ChatServer chatServer) { this.clientSocket = clientSocket; this.chatServer = chatServer; } @Override public void run() { try { setupStreams(); requestUsername(); announceJoin(); listenForMessages(); } catch (IOException e) { System.err.println("Client handler error: " + e.getMessage()); } finally { cleanup(); } } private void setupStreams() throws IOException { out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); } private void requestUsername() throws IOException { out.println("Enter your username:"); username = in.readLine(); if (username == null || username.trim().isEmpty()) { username = "Anonymous"; } } private void announceJoin() { chatServer.broadcastSystemMessage("[System] " + username + " joined the chat."); } private void listenForMessages() throws IOException { String message; while ((message = in.readLine()) != null) { chatServer.broadcast(username + ": " + message, this); } } private void cleanup() { chatServer.removeClient(this); try { if (clientSocket != null && !clientSocket.isClosed()) { clientSocket.close(); } } catch (IOException e) { System.err.println("Error closing socket: " + e.getMessage()); } } public void sendMessage(String message) { out.println(message); } public String getUsername() { return username; } }