实现了一个简单的聊天应用,包括聊天服务器 (ChatServer) 和聊天客户端 (ChatClient)。下面是对代码的详细讲解:
- 聊天服务器 (ChatServer)
主要功能:
启动一个服务器,监听客户端的连接请求。
处理用户的登录和注册请求。
允许用户发送公共消息和私聊消息。
将聊天记录保存到数据库,并支持导出聊天记录。
关键部分:
数据库连接:服务器启动时连接到 MySQL 数据库,用于存储用户信息和聊天记录。
java
dbConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ChatApp", "root", "1234");
客户端处理:每当有新客户端连接时,服务器会为其创建一个新的 ClientHandler 线程,处理该客户端的请求。
java
new ClientHandler(socket).start();
用户管理:使用 HashMap 存储已连接的客户端,键为用户名,值为 ClientHandler 实例。
java
private HashMap<String, ClientHandler> clients = new HashMap<>();
消息广播:服务器可以将消息广播给所有已连接的客户端。
java
public synchronized void broadcastMessage(String message, String sender) {
for (ClientHandler client : clients.values()) {
client.sendMessage(message);
}
}
用户列表更新:每当用户登录或断开连接时,服务器会更新用户列表并广播在线用户信息。
java
public synchronized void updateUserList() {
userListModel.clear();
for (String username : clients.keySet()) {
userListModel.addElement(username);
}
}
聊天记录导出:用户可以通过 GUI 界面将聊天记录导出到文本文件中。
java
private void exportChatLog() {
FileWriter writer = new FileWriter("chat_log.txt");
writer.write(chatLogArea.getText());
writer.close();
}
- 聊天客户端 (ChatClient)
主要功能:
连接到聊天服务器。
提供用户登录和注册界面。
显示聊天记录和发送消息。
支持私聊功能。
关键部分:
连接服务器:客户端通过 Socket 连接到指定的服务器地址和端口。
java
socket = new Socket(serverAddress, port);
用户界面:使用 Swing 创建用户登录/注册界面和聊天界面,用户可以在这些界面中输入用户名和密码。
java
private void showLoginOrRegisterUI() {
// 创建登录/注册界面
}
发送和接收消息:客户端可以发送消息到服务器,并通过 IncomingMessagesHandler 线程接收来自服务器的消息。
java
public void sendMessage(JTextField inputField) {
out.println(message);
}
私聊功能:用户可以选择发送私聊消息,通过指定接收者的用户名进行私聊。
java
private void showPrivateChatUI() {
// 创建私聊界面
}
- 数据库操作
用户验证:在登录时,服务器会查询数据库验证用户的用户名和密码。
java
private boolean validateLogin(String username, String password) {
PreparedStatement stmt = dbConnection.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?");
// ...
}
用户注册:在注册时,服务器会尝试将新用户信息插入到数据库中。
java
private boolean registerUser(String username, String password) {
PreparedStatement stmt = dbConnection.prepareStatement("INSERT INTO users (username, password) VALUES (?, ?)");
// ...
}
消息存储:每当用户发送消息时,服务器会将消息存储到数据库中。
java
private void saveMessageToDatabase(String sender, String receiver, String message) {
PreparedStatement stmt = dbConnection.prepareStatement("INSERT INTO messages (sender, receiver, message) VALUES (?, ?, ?)");
// ...
}
总结
这个聊天应用的设计相对简单,但实现了基本的聊天功能,包括用户管理、消息发送和接收、私聊功能以及聊天记录的存储和导出。可以作为学习 Java 网络编程和 GUI 编程的一个良好示例。
// 聊天服务器类
public class ChatServer {
private ServerSocket serverSocket;
private HashMap<String, ClientHandler> clients = new HashMap<>(); // 存储已连接的客户端
private Connection dbConnection;
private DefaultListModel<String> userListModel; // 用户列表模型
private JList<String> userList; // 用户列表视图
private JTextArea chatLogArea; // 聊天记录区域
// 启动服务器方法
public void startServer(int port) {
try {
// 连接到数据库
dbConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ChatApp", "root", "1234"); // 修改为您的数据库信息
serverSocket = new ServerSocket(port);
System.out.println("服务器已启动,端口号: " + port);
// 创建用户列表窗口
createUserListWindow();
// 不断接受客户端连接
while (true) {
Socket socket = serverSocket.accept();
System.out.println("新客户端已连接: " + socket.getInetAddress());
new ClientHandler(socket).start(); // 为每个客户端启动独立的线程
}
} catch (IOException | SQLException e) {
e.printStackTrace();
} finally {
stopServer();
}
}