79 lines
2.1 KiB
Java
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;
|
|
}
|
|
}
|