bro是个懒狗,耗时一个晚上,只写了一些基础功能,其他的可以根据必要自己添加
实现思绪:在MySQL数据库中设置一个message表,用来存储聊天信息,聊天界面输入的内容写入message表,用户程序每秒从MySQL中获取一次聊天记录,并加载进入自己的页面,实现聊天室。
食用方法:
ChatServer类中的数据库信息修改为自己的数据库
从ChatApplication类启动
复制粘贴主类中的user语句,可以添加多个用户窗口进行测试。用户名用来作为聊天室中的昵称
下方的输入框里输入信息,回车键发送,实现相互聊天。
下面是源代码(附表明)
pom依赖- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- </dependency>
-
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.32</version>
- </dependency>
-
-
- <dependency>
- <groupId>net.sf.json-lib</groupId>
- <artifactId>json-lib</artifactId>
- <version>2.4</version>
- <classifier>jdk15</classifier>
- </dependency>
复制代码 ChatApplication- import javax.swing.*;
- // 定义一个名为ChatApplication的公共类,作为聊天应用程序的入口
- public class ChatApplication {
- // main方法是Java程序的入口点
- public static void main(String[] args) {
- // 使用SwingUtilities.invokeLater确保GUI创建和更新在事件调度线程上进行
- SwingUtilities.invokeLater(() -> {
- // 创建ChatServer实例,用于管理聊天服务器和数据库交互
- ChatServer server = new ChatServer();
- // 创建三个User实例,模拟三个用户连接到聊天服务器
- new User(server);
- new User(server);
- new User(server);
- });
- }
- }
复制代码 ChatServer- import java.sql.*;
- // ChatServer类,用于管理聊天服务器的功能,包括数据库连接、消息存储和检索
- public class ChatServer {
- // 数据库连接对象
- private Connection connection;
- // ChatServer的构造函数,初始化数据库连接并准备聊天环境
- public ChatServer() {
- try {
- // 初始化数据库连接
- // 设置数据库URL、用户名和密码
- String url = "jdbc:mysql://localhost:3306/atguigudb"; // 数据库URL
- String user = "root"; // 数据库用户名
- String password = "123456"; // 数据库密码
- // 获取数据库连接
- connection = DriverManager.getConnection(url, user, password);
- // 创建消息表,如果表不存在则创建
- createMessagesTable();
- // 可选操作:清空聊天记录(根据需求决定是否执行)
- clearChatHistory();
- } catch (Exception e) {
- // 打印异常堆栈信息
- e.printStackTrace();
- }
- }
- // 创建消息表的方法
- private void createMessagesTable() {
- // SQL语句:如果消息表不存在,则创建它
- String createTableSQL = "CREATE TABLE IF NOT EXISTS messages ("
- + "id INT AUTO_INCREMENT PRIMARY KEY, " // 自增主键
- + "sender VARCHAR(255) NOT NULL, " // 发送者
- + "content TEXT NOT NULL, " // 消息内容
- + "timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP" // 时间戳,默认为当前时间
- + ")";
- try (Statement stmt = connection.createStatement()) {
- // 执行SQL语句
- stmt.execute(createTableSQL);
- } catch (Exception e) {
- // 打印异常堆栈信息
- e.printStackTrace();
- }
- }
- // 清空聊天记录的方法(可选)
- private void clearChatHistory() {
- try (PreparedStatement ps = connection.prepareStatement("DELETE FROM messages")) {
- // 执行删除操作,清空messages表
- ps.executeUpdate();
- } catch (Exception e) {
- // 打印异常堆栈信息
- e.printStackTrace();
- }
- }
- // 保存聊天消息的方法
- public void saveMessage(String sender, String message) {
- try (PreparedStatement ps = connection.prepareStatement("INSERT INTO messages (sender,content) VALUES (?, ?)")) {
- // 设置SQL语句中的参数值
- ps.setString(1, sender);
- ps.setString(2, message);
- // 执行插入操作
- ps.executeUpdate();
- } catch (Exception e) {
- // 打印异常堆栈信息
- e.printStackTrace();
- }
- }
- // 获取所有聊天消息的方法
- public String getAllMessages() {
- StringBuilder chatHistory = new StringBuilder();
- try (PreparedStatement ps = connection.prepareStatement(
- "SELECT sender, content FROM messages ORDER BY timestamp ASC")) {
- // 执行查询操作
- ResultSet rs = ps.executeQuery();
- // 遍历结果集,构建聊天历史字符串
- while (rs.next()) {
- String sender = rs.getString("sender");
- String content = rs.getString("content");
- chatHistory.append(sender).append(": ").append(content).append("\n");
- }
- } catch (Exception e) {
- // 打印异常堆栈信息
- e.printStackTrace();
- }
- return chatHistory.toString(); // 返回聊天历史字符串
- }
- }
复制代码 User- import javax.swing.*;
- import java.awt.*;
- // User类,用于管理用户登录界面和启动聊天客户端
- public class User {
- private ChatServer server;
- // User的构造函数,接收ChatServer实例并启动用户登录界面
- public User(ChatServer server) {
- this.server = server;
- loginUser(); // 只启动一个用户的登录窗口,用于演示
- }
- // 启动用户登录界面的方法
- public void loginUser() {
- JFrame loginFrame = new JFrame("请输入用户名");
- JTextField usernameField = new JTextField(15);
- JButton loginButton = new JButton("登录");
- loginFrame.setLayout(new FlowLayout());
- loginFrame.add(new JLabel("用户名:"));
- loginFrame.add(usernameField);
- loginFrame.add(loginButton);
- loginFrame.setSize(400, 200);
- loginFrame.setLocationRelativeTo(null);
- loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- loginFrame.setVisible(true);
- // 为登录按钮添加事件监听器
- loginButton.addActionListener(e -> {
- String username = usernameField.getText().trim();
- if (!username.isEmpty()) {
- loginFrame.dispose();
- new ChatClient(username, server); // 启动聊天客户端
- } else {
- JOptionPane.showMessageDialog(loginFrame, "请输入用户名", "错误", JOptionPane.ERROR_MESSAGE);
- }
- });
- }
- }
复制代码 ChatClient- import javax.swing.*;
- import java.awt.*;
- // ChatClient类,用于管理聊天客户端的界面和功能
- public class ChatClient {
- private JFrame frame;
- private JTextArea chatArea;
- private JTextField inputField;
- private ChatServer server;
- private String username;
- // ChatClient的构造函数,接收用户名和ChatServer实例并初始化聊天客户端
- public ChatClient(String username, ChatServer server) {
- this.server = server;
- this.username = username;
- frame = new JFrame(username + " - 聊天室");
- frame.setSize(600, 400);
- frame.setLocationRelativeTo(null);
- chatArea = new JTextArea();
- chatArea.setFont(new Font("Noto Sans CJK", Font.PLAIN, 16));
- chatArea.setEditable(false); // 禁止编辑聊天区域
- inputField = new JTextField();
- inputField.setFont(new Font("Noto Sans CJK", Font.PLAIN, 16));
- frame.setLayout(new BorderLayout());
- frame.add(new JScrollPane(chatArea), BorderLayout.CENTER);
- frame.add(inputField, BorderLayout.SOUTH);
- loadChatHistory(); // 加载聊天历史
- // 为输入框添加事件监听器,用于发送消息
- inputField.addActionListener(e -> sendMessage());
- // 启动一个线程,定期加载聊天历史以更新聊天区域
- new Thread(() -> {
- while (true) {
- try {
- Thread.sleep(1000); // 每秒更新一次
- loadChatHistory();
- } catch (InterruptedException ex) {
- ex.printStackTrace();
- }
- }
- }).start();
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setVisible(true);
- }
- // 发送消息的方法
- private void sendMessage() {
- String message = inputField.getText();
- if (!message.trim().isEmpty()) {
- server.saveMessage(username, message); // 保存消息到服务器
- inputField.setText(""); // 清空输入框
- }
- }
- // 加载聊天历史的方法
- private void loadChatHistory() {
- String chatHistory = server.getAllMessages(); // 从服务器获取聊天历史
- chatArea.setText(chatHistory); // 设置聊天区域的内容
- chatArea.setCaretPosition(chatArea.getDocument().getLength()); // 将光标移动到文本末尾
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |