java小课设:利用MySQL做一个聊天室

打印 上一主题 下一主题

主题 817|帖子 817|积分 2451

bro是个懒狗,耗时一个晚上,只写了一些基础功能,其他的可以根据必要自己添加

实现思绪:在MySQL数据库中设置一个message表,用来存储聊天信息,聊天界面输入的内容写入message表,用户程序每秒从MySQL中获取一次聊天记录,并加载进入自己的页面,实现聊天室。

食用方法:
ChatServer类中的数据库信息修改为自己的数据库
从ChatApplication类启动
复制粘贴主类中的user语句,可以添加多个用户窗口进行测试。
  1. new User(server);
复制代码
用户名用来作为聊天室中的昵称

下方的输入框里输入信息,回车键发送,实现相互聊天。



下面是源代码(附表明)

pom依赖
  1.         <dependency>
  2.             <groupId>commons-logging</groupId>
  3.             <artifactId>commons-logging</artifactId>
  4.             <version>1.1.1</version>
  5.         </dependency>
  6.         
  7.         <dependency>
  8.             <groupId>mysql</groupId>
  9.             <artifactId>mysql-connector-java</artifactId>
  10.             <version>8.0.32</version>
  11.         </dependency>
  12.         
  13.         
  14.         <dependency>
  15.             <groupId>net.sf.json-lib</groupId>
  16.             <artifactId>json-lib</artifactId>
  17.             <version>2.4</version>
  18.             <classifier>jdk15</classifier>
  19.         </dependency>
复制代码
ChatApplication
  1. import javax.swing.*;
  2. // 定义一个名为ChatApplication的公共类,作为聊天应用程序的入口
  3. public class ChatApplication {
  4.     // main方法是Java程序的入口点
  5.     public static void main(String[] args) {
  6.         // 使用SwingUtilities.invokeLater确保GUI创建和更新在事件调度线程上进行
  7.         SwingUtilities.invokeLater(() -> {
  8.             // 创建ChatServer实例,用于管理聊天服务器和数据库交互
  9.             ChatServer server = new ChatServer();
  10.             // 创建三个User实例,模拟三个用户连接到聊天服务器
  11.             new User(server);
  12.             new User(server);
  13.             new User(server);
  14.         });
  15.     }
  16. }
复制代码
ChatServer
  1. import java.sql.*;
  2. // ChatServer类,用于管理聊天服务器的功能,包括数据库连接、消息存储和检索
  3. public class ChatServer {
  4.     // 数据库连接对象
  5.     private Connection connection;
  6.     // ChatServer的构造函数,初始化数据库连接并准备聊天环境
  7.     public ChatServer() {
  8.         try {
  9.             // 初始化数据库连接
  10.             // 设置数据库URL、用户名和密码
  11.             String url = "jdbc:mysql://localhost:3306/atguigudb"; // 数据库URL
  12.             String user = "root"; // 数据库用户名
  13.             String password = "123456"; // 数据库密码
  14.             // 获取数据库连接
  15.             connection = DriverManager.getConnection(url, user, password);
  16.             // 创建消息表,如果表不存在则创建
  17.             createMessagesTable();
  18.             // 可选操作:清空聊天记录(根据需求决定是否执行)
  19.             clearChatHistory();
  20.         } catch (Exception e) {
  21.             // 打印异常堆栈信息
  22.             e.printStackTrace();
  23.         }
  24.     }
  25.     // 创建消息表的方法
  26.     private void createMessagesTable() {
  27.         // SQL语句:如果消息表不存在,则创建它
  28.         String createTableSQL = "CREATE TABLE IF NOT EXISTS messages ("
  29.                 + "id INT AUTO_INCREMENT PRIMARY KEY, " // 自增主键
  30.                 + "sender VARCHAR(255) NOT NULL, " // 发送者
  31.                 + "content TEXT NOT NULL, " // 消息内容
  32.                 + "timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP" // 时间戳,默认为当前时间
  33.                 + ")";
  34.         try (Statement stmt = connection.createStatement()) {
  35.             // 执行SQL语句
  36.             stmt.execute(createTableSQL);
  37.         } catch (Exception e) {
  38.             // 打印异常堆栈信息
  39.             e.printStackTrace();
  40.         }
  41.     }
  42.     // 清空聊天记录的方法(可选)
  43.     private void clearChatHistory() {
  44.         try (PreparedStatement ps = connection.prepareStatement("DELETE FROM messages")) {
  45.             // 执行删除操作,清空messages表
  46.             ps.executeUpdate();
  47.         } catch (Exception e) {
  48.             // 打印异常堆栈信息
  49.             e.printStackTrace();
  50.         }
  51.     }
  52.     // 保存聊天消息的方法
  53.     public void saveMessage(String sender, String message) {
  54.         try (PreparedStatement ps = connection.prepareStatement("INSERT INTO messages (sender,content) VALUES (?, ?)")) {
  55.             // 设置SQL语句中的参数值
  56.             ps.setString(1, sender);
  57.             ps.setString(2, message);
  58.             // 执行插入操作
  59.             ps.executeUpdate();
  60.         } catch (Exception e) {
  61.             // 打印异常堆栈信息
  62.             e.printStackTrace();
  63.         }
  64.     }
  65.     // 获取所有聊天消息的方法
  66.     public String getAllMessages() {
  67.         StringBuilder chatHistory = new StringBuilder();
  68.         try (PreparedStatement ps = connection.prepareStatement(
  69.                 "SELECT sender, content FROM messages ORDER BY timestamp ASC")) {
  70.             // 执行查询操作
  71.             ResultSet rs = ps.executeQuery();
  72.             // 遍历结果集,构建聊天历史字符串
  73.             while (rs.next()) {
  74.                 String sender = rs.getString("sender");
  75.                 String content = rs.getString("content");
  76.                 chatHistory.append(sender).append(": ").append(content).append("\n");
  77.             }
  78.         } catch (Exception e) {
  79.             // 打印异常堆栈信息
  80.             e.printStackTrace();
  81.         }
  82.         return chatHistory.toString(); // 返回聊天历史字符串
  83.     }
  84. }
复制代码
User
  1. import javax.swing.*;
  2. import java.awt.*;
  3. // User类,用于管理用户登录界面和启动聊天客户端
  4. public class User {
  5.     private ChatServer server;
  6.     // User的构造函数,接收ChatServer实例并启动用户登录界面
  7.     public User(ChatServer server) {
  8.         this.server = server;
  9.         loginUser(); // 只启动一个用户的登录窗口,用于演示
  10.     }
  11.     // 启动用户登录界面的方法
  12.     public void loginUser() {
  13.         JFrame loginFrame = new JFrame("请输入用户名");
  14.         JTextField usernameField = new JTextField(15);
  15.         JButton loginButton = new JButton("登录");
  16.         loginFrame.setLayout(new FlowLayout());
  17.         loginFrame.add(new JLabel("用户名:"));
  18.         loginFrame.add(usernameField);
  19.         loginFrame.add(loginButton);
  20.         loginFrame.setSize(400, 200);
  21.         loginFrame.setLocationRelativeTo(null);
  22.         loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  23.         loginFrame.setVisible(true);
  24.         // 为登录按钮添加事件监听器
  25.         loginButton.addActionListener(e -> {
  26.             String username = usernameField.getText().trim();
  27.             if (!username.isEmpty()) {
  28.                 loginFrame.dispose();
  29.                 new ChatClient(username, server); // 启动聊天客户端
  30.             } else {
  31.                 JOptionPane.showMessageDialog(loginFrame, "请输入用户名", "错误", JOptionPane.ERROR_MESSAGE);
  32.             }
  33.         });
  34.     }
  35. }
复制代码
ChatClient
  1. import javax.swing.*;
  2. import java.awt.*;
  3. // ChatClient类,用于管理聊天客户端的界面和功能
  4. public class ChatClient {
  5.     private JFrame frame;
  6.     private JTextArea chatArea;
  7.     private JTextField inputField;
  8.     private ChatServer server;
  9.     private String username;
  10.     // ChatClient的构造函数,接收用户名和ChatServer实例并初始化聊天客户端
  11.     public ChatClient(String username, ChatServer server) {
  12.         this.server = server;
  13.         this.username = username;
  14.         frame = new JFrame(username + " - 聊天室");
  15.         frame.setSize(600, 400);
  16.         frame.setLocationRelativeTo(null);
  17.         chatArea = new JTextArea();
  18.         chatArea.setFont(new Font("Noto Sans CJK", Font.PLAIN, 16));
  19.         chatArea.setEditable(false); // 禁止编辑聊天区域
  20.         inputField = new JTextField();
  21.         inputField.setFont(new Font("Noto Sans CJK", Font.PLAIN, 16));
  22.         frame.setLayout(new BorderLayout());
  23.         frame.add(new JScrollPane(chatArea), BorderLayout.CENTER);
  24.         frame.add(inputField, BorderLayout.SOUTH);
  25.         loadChatHistory(); // 加载聊天历史
  26.         // 为输入框添加事件监听器,用于发送消息
  27.         inputField.addActionListener(e -> sendMessage());
  28.         // 启动一个线程,定期加载聊天历史以更新聊天区域
  29.         new Thread(() -> {
  30.             while (true) {
  31.                 try {
  32.                     Thread.sleep(1000); // 每秒更新一次
  33.                     loadChatHistory();
  34.                 } catch (InterruptedException ex) {
  35.                     ex.printStackTrace();
  36.                 }
  37.             }
  38.         }).start();
  39.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  40.         frame.setVisible(true);
  41.     }
  42.     // 发送消息的方法
  43.     private void sendMessage() {
  44.         String message = inputField.getText();
  45.         if (!message.trim().isEmpty()) {
  46.             server.saveMessage(username, message); // 保存消息到服务器
  47.             inputField.setText(""); // 清空输入框
  48.         }
  49.     }
  50.     // 加载聊天历史的方法
  51.     private void loadChatHistory() {
  52.         String chatHistory = server.getAllMessages(); // 从服务器获取聊天历史
  53.         chatArea.setText(chatHistory); // 设置聊天区域的内容
  54.         chatArea.setCaretPosition(chatArea.getDocument().getLength()); // 将光标移动到文本末尾
  55.     }
  56. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表