Skip to main content

Developing a Realtime Chat System

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class ChatServer {
private static final int PORT = 12345;
private static final Set<ClientHandler> CLIENTS = Collections.synchronizedSet(new HashSet<>());

public static void main(String[] args) {
System.out.println("Chat server started...");

try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("New client connected: " + clientSocket.getInetAddress());

ClientHandler clientHandler = new ClientHandler(clientSocket);
CLIENTS.add(clientHandler);
new Thread(clientHandler).start();
}
} catch (IOException e) {
System.out.println("Server error: " + e.getMessage());
}
}

public static void boardcast(String message, ClientHandler sender) {
synchronized (CLIENTS) {
for (ClientHandler client : CLIENTS) {
if (client != sender) {
client.sendMessage(message);
}
}
}
}

public static void removeClient(ClientHandler clientHandler) {
CLIENTS.remove(clientHandler);
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient {
private static final String SERVER_ADDRESS = "127.0.0.1";
private static final int SERVER_PORT = 12345;

public static void main(String[] args) {
try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT)) {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));

System.out.println("Connected to chat server.");

new Thread(() -> {
String message;
try {
while ((message = in.readLine()) != null) {
System.out.println("Received: " + message);
}
} catch (IOException e) {
System.out.println("Connection error" + e.getMessage());
}
}).start();

String userInput;
while ((userInput = console.readLine()) != null) {
out.println(userInput);
}
} catch (IOException e) {
System.out.println("Client error: " + e.getMessage());
}
}
}
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 PrintWriter out;

public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}

@Override
public void run() {
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
out = new PrintWriter(clientSocket.getOutputStream(), true);
String message;
while ((message = in.readLine()) != null) {
System.out.println("Received: " + message);
ChatServer.boardcast(message, this);
}
} catch (IOException e) {
System.out.println("Client Error: " + e.getMessage());
} finally {
ChatServer.removeClient(this);
try {
clientSocket.close();
} catch (IOException e) {
System.out.println("Failed to close socket: " + e.getMessage());
}
}
}

public void sendMessage(String message) {
if (out != null) {
out.println(message);
}
}
}