请编写代码满足以下要求:借助于socket和java,实现一个公共聊天室的功能。 1、其中服务器用于接收和转发信息,多个客户端可以自由通信。 2、实现用户注册功能,聊天过程中展示用户的昵称和聊天内容。 3、用户可以查询以前参与过的用户的聊天记录。
时间: 2025-02-14 15:21:25 浏览: 29
为了实现这个公共聊天室的服务器端部分,我们可以使用Java的Socket和ServerSocket类,以及线程处理多个客户端连接。以下是一个简单的示例:
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
private static final int PORT = 8080;
private static HashSet<String> users = new HashSet<>();
private Map<String, PrintWriter> writers = new HashMap<>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Chat server started on port " + PORT);
while (true) {
Socket clientSocket = serverSocket.accept();
Thread clientThread = new ClientHandler(clientSocket);
clientThread.start();
}
}
private static class ClientHandler extends Thread {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(), true);
String message;
while ((message = reader.readLine()) != null) {
handleMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
closeConnection();
}
}
private void handleMessage(String message) {
if (message.startsWith("/register")) {
registerUser(message.split(":")[1]);
} else {
broadcastMessage(message);
}
}
private void registerUser(String username) {
if (!users.contains(username)) {
users.add(username);
System.out.println("User " + username + " registered.");
writeToAll("/user_registered " + username);
} else {
writeError("Username already taken");
}
}
private void broadcastMessage(String message) {
for (PrintWriter printWriter : writers.values()) {
printWriter.println(message);
}
}
private void writeError(String errorMessage) {
writeToCurrentClient(errorMessage);
}
private void writeToCurrentClient(String message) {
writer.println(message);
}
private void writeToAll(String message) {
for (String user : users) {
if (writers.containsKey(user)) {
writers.get(user).println(message);
}
}
}
private void closeConnection() {
try {
writer.close();
reader.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
writers.remove(socket.getRemoteSocketAddress().toString());
}
}
// Additional methods for handling chat history or saving to a file would go here.
}
```
此代码创建了一个监听指定端口的服务器,每个新连接会触发`ClientHandler`类的一个实例。客户端发送的消息会被解析并相应地处理,如注册新用户、广播消息等。
为了实现查询聊天记录和保存历史,你需要添加额外的方法来读取存储的历史消息(例如,将聊天内容保存到数据库或文件中),并在需要的时候提供查询功能。这超出了上述基础代码的范围,但你可以根据实际需求对其进行扩展。
阅读全文