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

news/2024/11/14 18:31:22/文章来源:https://www.cnblogs.com/h4o3/p/18539133

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


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


食用方法:

ChatServer类中的数据库信息修改为自己的数据库

从ChatApplication类启动

复制粘贴主类中的user语句,可以添加多个用户窗口进行测试。

new User(server);

用户名用来作为聊天室中的昵称

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



下面是源代码(附注释)


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><!--        JSONObject.fromObject()的依赖, JSONArray.fromObject()--><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"; // 数据库URLString 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()); // 将光标移动到文本末尾}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/831955.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quartz集群增强版_00.How to use?(如何使用)

Quartz集群增强版_00.How to use?(如何使用)转载请著名出处 https://www.cnblogs.com/funnyzpc/p/18540378开源地址 https://github.com/funnyzpc/quartz 表的基本结构 总的来说任务的配置及开发基本遵从上图的表的基本关系,除 app 以及 node 之外均需要手动手动配置,app…

开源三代示波器的高速波形刷新方案开源,支持VNC远程桌面,手机,Pad,电脑均可访问(2024-11-11)

说明: 1、本来这段时间是一年一度Hackaday硬件设计开源盛宴,但hackaday电子大赛在去年终结了。所以我开源个我的吧。 2、三代示波器的高速波形刷新方案,前两年就做好了,这两年忙H7-TOOL的更新比较多,三代示波器的更新就搁置了。但刷新方案是没问题的,开源分享给大家。 3、…

PSQL 环境安装配置

准备工作:安装包 plsqldev1400x64.msi 注册码 汉化包 chinese.exe 轻量级数据 instantclient_11_2 安装【PSQL】第一步大法操作! 默认的安装路径:C:\Program Files\PLSQL Developer 14安装【轻量级 instantclient_11_2】 复制或解压到 C:\Program Files\PLSQL Developer…

零声QT学习 一

int main(int argc, char *argv[]) {QApplication a(argc, argv);//QApplication a(argc, argv),针对QWidget应用程序,管理和设置Qt程序的运行//QGuiApplication a(argc, argv),针对非QWidget应用程序,如QQuick//QcoreApplication a(argc, argv),针对无界面的应用程序MainWindo…

【教程】第四章:任务与评论插件 —— 如虎添翼,顺利掌握

一起在 NocoBase 中创造精彩应用!这些教程将通过手把手的操作,帮助你全面掌握核心功能,激发灵感,打造并分享满足多样需求的应用。回顾上一节 小伙伴们还记得上一节的挑战任务吗?我们要为任务表配置 状态 和 附件 字段,并在任务列表里展示它们。别急,咱们先揭晓答案!状态…

wsl2踩坑日记(配置代理/zsh+p10k/Neovim)

1. proxy wsl --install Ubuntu-24.04 安装好 wsl 之后,测试了一下 v2rayN 的代理能不能正常使用(用 vultr 服务器搭建的校园网 ipv6 免流),发现可以 curl www.google.com,但是 sudo apt-get update 报错 Clearsigned file isnt valid, got NOSPLIT (does the network req…

基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要基于MIMO(Multiple-Input Multiple-Output)系统的SDR-AltMin混合预编码算法是一种先进的无线通信技术,它结合了凸优化和交替最小化技术来…

前端技术对html中块级元素的学习

块级元素目录块级元素列表元素有序列表无序列表自定义列表 列表元素 有序列表 在 HTML 中, 标签用来表示有序列表。有序列表之间的内容有先后顺序之分,例如菜谱中的一系列步骤,这些步骤需要按顺序完成,这时就可以使用有序列表。 我们来看一个简单的实例: <!DOCTYPE ht…

IDEA-idea激活

通过百度网盘分享的文件:IDEA激活工具 链接:https://pan.baidu.com/s/18QIqrMVE4ScNhBjhwde_7Q 提取码:sky1二、重启电脑

说明与笔记导航

对使用这些笔记的同学想说的话,以及更新进度。为什么写这么多B东西? 其一呢是帮助我自己,边写笔记边梳理知识;其二呢是帮助各位义父义母考试成功。 更新进度与内容说明 11.11:本周工作日需突击学习python,计划今晚更新有限体积法剩余部分。 目前进度:3009 建模:数值方法…

鸿蒙NEXT开发案例:指尖轮盘

【1】引言 “指尖轮盘”是一个简单而有趣的互动游戏(类似抓阄),这个应用通过触摸屏幕的方式,让玩家参与一个激动人心的游戏,最终选出幸运的赢家。未来可以进一步扩展功能,如增加游戏模式、优化动画效果、增加音效等,提升用户体验。 【2】环境准备 电脑系统:windows 10 …

antD——Warning: `callback` is deprecated. Please return a promise instead.

参考: 1. https://blog.csdn.net/huochai770880/article/details/125925665我的情况 antD表单校验,代码未报错,但提交时控制台报错:Warning: `callback` is deprecated. Please return a promise instead.原报错代码:const validateParams = useCallback((_: RuleObject, …