//ChatServer.java
Package Project; import java.io.; import java.net.; import java.util.concurrent.*;
public class ChatServer { private static final int PORT = 12345; private static CopyOnWriteArrayList clients = new CopyOnWriteArrayList<>(); private static ConcurrentHashMap<String, ClientHandler> clientMap = new ConcurrentHashMap<>();
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
System.out.println("Chat server started on port " + PORT);
while (true) {
Socket clientSocket = serverSocket.accept();
ClientHandler clientHandler = new ClientHandler(clientSocket);
clients.add(clientHandler);
new Thread(clientHandler).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void broadcastMessage(String message) {
for (ClientHandler client : clients) {
client.sendMessage(message);
}
}
public static void sendPrivateMessage(String clientId, String message) {
ClientHandler client = clientMap.get(clientId);
if (client != null) {
client.sendMessage(message);
}
}
public static void removeClient(ClientHandler clientHandler) {
clients.remove(clientHandler);
clientMap.remove(clientHandler.getClientId());
}
static class ClientHandler implements Runnable {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private String clientId;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
clientId = in.readLine();
clientMap.put(clientId, this);
System.out.println("Client connected: " + clientId);
String message;
while ((message = in.readLine()) != null) {
if (message.startsWith("@")) {
int spaceIndex = message.indexOf(' ');
if (spaceIndex != -1) {
String targetClientId = message.substring(1, spaceIndex);
String privateMessage = message.substring(spaceIndex + 1);
sendPrivateMessage(targetClientId, privateMessage);
System.out.println("Private message from " + clientId + " to " + targetClientId + ": " + privateMessage);
}
} else {
broadcastMessage(clientId + ": " + message);
System.out.println("Broadcast message from " + clientId + ": " + message);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
removeClient(this);
System.out.println("Client disconnected: " + clientId);
}
}
public void sendMessage(String message) {
out.println(message);
}
public String getClientId() {
return clientId;
}
}
}
//ChatClient.java
package project; import java.io.; import java.net.; import java.util.Scanner;
public class ChatClient { private static final String SERVER_ADDRESS = "localhost"; private static final int SERVER_PORT = 12345;
public static void main(String[] args) {
try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
Scanner scanner = new Scanner(System.in);
// Send client ID to the server
System.out.print("Enter your client ID: ");
String clientId = scanner.nextLine();
out.println(clientId);
// Start a new thread to listen for messages from the server
Thread listenerThread = new Thread(() -> {
String serverMessage;
try {
while ((serverMessage = in.readLine()) != null) {
System.out.println(serverMessage);
}
} catch (IOException e) {
e.printStackTrace();
}
});
listenerThread.start();
// Read messages from the console and send them to the server
String message;
while (scanner.hasNextLine()) {
message = scanner.nextLine();
out.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}