实现一个简单的聊天功能可以通过Java的Socket编程来完成。下面将介绍如何使用Java编写一个基本的客户端-服务器聊天应用程序。此应用程序允许多个客户端连接到服务器,并在客户端之间进行消息传递。
架构概述
服务器端(Server):负责监听客户端连接,接收来自客户端的消息,并将消息广播给所有连接的客户端。
客户端(Client):连接到服务器,发送消息给服务器,并接收来自服务器的广播消息。
实现步骤
服务器端
使用ServerSocket监听特定端口。
接受客户端连接,并为每个客户端创建一个新的线程进行处理。
维护一个客户端列表,便于广播消息。
客户端
使用Socket连接到服务器。
启动一个线程用于接收来自服务器的消息。
允许用户通过控制台输入消息并发送到服务器。
代码实现
1. 服务器端代码 (ChatServer.java)
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 = ConcurrentHashMap.newKeySet();
public static void main(String[] args) {
System.out.println("聊天服务器启动,监听端口 " + PORT);
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
// 等待客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("新客户端连接: " + clientSocket);
// 启动新的线程处理客户端
new Thread(new ClientHandler(clientSocket)).start();
}
} catch (IOException e) {
System.err.println("服务器异常: " + e.getMessage());
e.printStackTrace();
}
}
// 处理每个客户端的线程
private static class ClientHandler implements Runnable {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
public ClientHandler(Socket socket) {
this.socket = socket;
}
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("收到消息: " + message);
broadcast(message);
}
} catch (IOException e) {
System.err.println("客户端连接异常: " + e.getMessage());
} finally {
// 清理资源
try {