Files
WS-09-Network/src/main/java/chat/ClientHandler.java
T
2026-06-07 10:23:19 +03:30

79 lines
2.1 KiB
Java

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;
}
}