多人聊天室
这个简单的聊天室示例允许多个客户端通过输入消息与服务器进行通信,服务器会将接收到的消息广播给所有连接的客户端。客户端和服务器之间的通信是基于Socket实现的。确保将服务器地址和端口号与你的实际配置相匹配。
package chatting;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;
public class ChatServer {
private static final int PORT = 12345;
private static Set<PrintWriter> clientWriters = new CopyOnWriteArraySet<>();
public static void main(String[] args) {
System.out.println("Chat Server is running...");
ExecutorService pool = Executors.newFixedThreadPool(10);
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
new ClientHandler(serverSocket.accept(), pool).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class ClientHandler extends Thread {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private ExecutorService pool;
public ClientHandler(Socket socket, ExecutorService pool) {
this.socket = socket;
this.pool = pool;
}
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
clientWriters.add(out);
String message;
while ((message = in.readLine()) != null) {
System.out.println("Received: " + message);
broadcast(message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
clientWriters.remove(out);
}
}
private void broadcast(String message) {
for (PrintWriter writer : clientWriters) {
writer.println(message);
}
}
}
}
class ChatClientUser {
public static void main(String[] args) {
final String SERVER_ADDRESS = "localhost";
final int SERVER_PORT = 12345;
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);
Thread inputThread = new Thread(() -> {
try {
String userInput;
while ((userInput = scanner.nextLine()) != null) {
out.println(userInput);
}
} catch (Exception e) {
e.printStackTrace();
}
});
inputThread.start();
String serverResponse;
while ((serverResponse = in.readLine()) != null) {
System.out.println("Received from server: " + serverResponse);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ChatClientUserA {
public static void main(String[] args) {
final String SERVER_ADDRESS = "localhost";
final int SERVER_PORT = 12345;
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);
Thread inputThread = new Thread(() -> {
try {
String userInput;
while ((userInput = scanner.nextLine()) != null) {
out.println(userInput);
}
} catch (Exception e) {
e.printStackTrace();
}
});
inputThread.start();
String serverResponse;
while ((serverResponse = in.readLine()) != null) {
System.out.println("Received from server: " + serverResponse);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ChatClientUserB {
public static void main(String[] args) {
final String SERVER_ADDRESS = "localhost";
final int SERVER_PORT = 12345;
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);
Thread inputThread = new Thread(() -> {
try {
String userInput;
while ((userInput = scanner.nextLine()) != null) {
out.println(userInput);
}
} catch (Exception e) {
e.printStackTrace();
}
});
inputThread.start();
String serverResponse;
while ((serverResponse = in.readLine()) != null) {
System.out.println("Received from server: " + serverResponse);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}