当前位置: 首页 > news >正文

chat4-Server端保存聊天消息到mysql

本文档描述了Server端接收到Client的消息并转发给所有客户端或私发给某个客户端

同时将聊天消息保存到mysql

服务端为当前客户端创建一个线程,此线程接收当前客户端的消息并转发给所有客户端或私发给某个客户端同时将聊天消息保存到mysql

本文档主要总结了将聊天消息保存到mysql !!!

一、mysql:

mysql数据库中创建chatinfo表。

create table chatinfo(
    id int auto_increment,
    from_user varchar(40) null,
    to_user varchar(40) null,
    content varchar(400),
    constraint chatinfo_pk  primary key (id)

),;

二、DBUtil工具类:

package chat4_all;
import java.sql.Connection;
import java.sql.SQLException;
import com.alibaba.druid.pool.DruidDataSource;
/**用druid连接池来连接数据库的工具类*/
public class DBUtil {
    //1.DruidDataSource(可以理解为连接池)
    private static DruidDataSource ds = new DruidDataSource();

    static {
        //设置数据库的地址        ds.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true");
        ds.setUsername("root");//给DruidDataSource ds设置数据库用户名
        ds.setPassword("root");//给DruidDataSource ds设置数据库密码
        ds.setInitialSize(10);//给DruidDataSource ds初始容量
        ds.setMaxActive(20);//给DruidDataSource ds最大连接数
    }

    //2.用给DruidDataSource ds获取数据库连接的方法
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

三、导入jar

3.1.创建lib软件包:

3.2.将druid-1.1.20.jar和mysql-connector-java-8.0.23.jar粘贴到chat4.lib软件包中:

3.3.然后将jar包设置为项目的类库:

在druid-1.1.20.jar上点右键然后按下图方式点击add as library

在mysql-connector-java-8.0.23.jar上点右键然后按下图方式点击add as library

四、Server端:

4.1.saveMessage:

在sendMessageToSomeOne()方法上边添加 如下方法 (用于将三个数据保存到数据库)

(消息发送者、消息接收者、发送的消息)

/**
 * 将聊天消息保存到数据库中
 * @param fromUser  发送方昵称
 * @param toUser    接收方昵称
 * @param content   聊天消息
 */
public void saveMessage(String fromUser,String toUser,String content){
    try ( Connection connection = DBUtil.getConnection(); ){
        String sql = "INSERT INTO chatinfo(content,from_user,to_user) " +
                     "VALUES (?,?,?)";
        PreparedStatement ps = connection.prepareStatement(sql);
        ps.setString(1,content);
        ps.setString(2,fromUser);
        ps.setString(3,toUser);
        ps.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

4.2.调用:

在Server里的ClientHandler类的run方法中循环读取客户端消息的循环中添加调用saveMessage()方法的一行代码。用于将群聊消息保存到mysql。

在Server里的ClientHandler类的sendMessageToOne()方法中添加调用saveMessage()方法的一行代码。如下图:

用于将私聊消息保存到mysql。

运行效果:

运行效果和上一版本chat3一样,不过多出了将聊天数据保存到mysql的功能。


                   

                                                                                                      By   zhaoyq   2024-05-31

相关文章:

chat4-Server端保存聊天消息到mysql

本文档描述了Server端接收到Client的消息并转发给所有客户端或私发给某个客户端 同时将聊天消息保存到mysql 服务端为当前客户端创建一个线程,此线程接收当前客户端的消息并转发给所有客户端或私发给某个客户端同时将聊天消息保存到mysql 本文档主要总结了将聊天…...

vivo鄢楠:基于OceanBase 的降本增效实践

在3 月 20 日的2024 OceanBase 数据库城市行中,vivo的 体系与流程 IT 部 DBA 组总监鄢楠就“vivo 基于 OceanBase 的降本增效实践”进行了主题演讲。本文为该演讲的精彩回顾。 vivo 在1995年于中国东莞成立,作为一家全球领先的移动互联网智能终端公司&am…...

arm cortex-m架构 SVC指令详解以及其在freertos的应用

1. 前置知识 本文基于arm cortex-m架构描述, 关于arm cortex-m的一些基础知识可以参考我另外几篇文章: arm cortex-m 架构简述arm异常处理分析c语言函数调用规范-基于arm 分析 2 SVC指令 2.1 SVC指令位域表示 bit15 - bit12:条件码&#…...

k8s笔记——kubernetes中的三种IP

kubernetes概念 Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控 Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行 Pod:kubernetes的…...

Golang | Leetcode Golang题解之第127题单词接龙

题目: 题解: func ladderLength(beginWord string, endWord string, wordList []string) int {wordId : map[string]int{}graph : [][]int{}addWord : func(word string) int {id, has : wordId[word]if !has {id len(wordId)wordId[word] idgraph a…...

微服务中feign远程调用相关的各种超时问题

1. 引言 在spring cloud微服中,feign远程调用可能是大家每天都接触到东西,但很多同学却没咋搞清楚这里边的各种超时问题,生产环境可能会蹦出各种奇怪的问题。 首先说下结论: 1)只使用feign组件,不使用ribbion组件&…...

springboot整合chatgpt,并且让其可以记录上下文

整合很简单,不过需要几个小条件 1.必须要有openai官方的key 2.国内需要有代理服务器或者国外的服务器把项目部署出去也没问题 我没有使用spring的springAI,听说很方便,日后有机会去体验体验,我今天用了两种方式整合了gpt 1.Ch…...

CTP前端:解码数字世界的魔法师

CTP前端:解码数字世界的魔法师 CTP前端,一个充满神秘与魅力的职业,他们在数字世界中挥舞着魔法棒,创造着令人惊叹的奇迹。那么,CTP前端究竟是做什么的呢?让我们从四个方面、五个方面、六个方面和七个方面&…...

rabbitmq的交换机类型以及他们的区别

RabbitMQ中有四种主要的交换机类型,它们是:Direct,Topic,Fanout,Headers。 Direct(直连交换机):接收到消息后,会将消息发送到与消息的routing key完全匹配的队列上。Dire…...

理解不同层的表示(layer representations)

在机器学习和深度学习领域,特别是在处理音频和自然语言处理(NLP)任务时,"层的表示"(layer representations)通常是指神经网络不同层在处理输入数据时生成的特征或嵌入。这些表示捕获了输入数据的…...

原生js访问http获取数据的方法

在原生JavaScript中,直接通过浏览器端的JavaScript访问HTTP接口获取数据通常涉及XMLHttpRequest对象或现代的fetch API。 1. 使用XMLHttpRequest XMLHttpRequest是一个老旧的API,但在某些情况下仍然很有用。以下是一个简单的例子: javascr…...

Windows 2000 Server:安全配置终极指南

"远古技术,仅供娱乐" 💭 前言:Windows 2000 服务器在当时的市场中占据了很大的比例,主要原因包括操作简单和易于管理,但也经常因为安全性问题受到谴责,Windows 2000 的安全性真的那么差吗&#x…...

基于 FastAI 文本迁移学习的情感分类(93%+Accuracy)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…...

集成Google Authenticator实现多因素认证(MFA)

目录 参考1、应用背景2、多因素认证3、谷歌google authenticator集成用法3.1、原理3.2、 MFA绑定3.2.1、 用户输入用户名密码登录3.2.2、检查是否已经绑定MFA(检查数据库是否保存该用户的google secret)3.2.3、谷歌身份证认证器扫描绑定3.2.4、手动测试验…...

网关(Gateway)- 自定义过滤器工厂

自定义过滤工厂类 DemoGatewayFilterFactory package com.learning.springcloud.custom;import org.apache.commons.lang.StringUtils; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChai…...

HTML静态网页成品作业(HTML+CSS)—— 香奈儿香水介绍网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…...

C++11 lambda表达式和包装器

C11 lambda表达式和包装器 一.lambda表达式1.lambda表达式的引入2.基本语法和使用1.基本语法2.使用1.传值捕捉的错误之处2.传引用捕捉 3.lambda表达式的底层原理4.lambda的特殊之处5.lambda配合decltype的新玩法 二.function包装器1.概念2.包装函数1.包装普通函数2.包装成员函数…...

3. MySQL 数据表的基本操作

文章目录 【 1. MySQL 创建数据表 】【 2. MySQL 查看表 】2.1 查看表的属性DESCRIBE/DESC 以表格的形式展示表属性SHOW CREATE TABLE 以SQL语句的形式展示表属性 2.2 查看表的内容 【 3. MySQL 修改数据表结构 】3.1 修改表名3.2 修改表字符集3.3 添加字段在末尾添加字段在开头…...

Linux命令篇(一):文件管理部分

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 1、cat命令常用参…...

IP协议1.0

基本概念: • 主机: 配有IP地址, 但是不进⾏路由控制的设备; • 路由器: 即配有IP地址, ⼜能进⾏路由控制; • 节点: 主机和路由器的统称; IP协议的报头 • 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. • 4位头部⻓度(header length): IP头部的⻓…...

驱动中阻塞相关函数的基础

wait_queue_head_t定义等待队列头#include <linux/wait.h> /** lock&#xff1a;自旋锁&#xff0c;用于保护队列操作&#xff08;如添加/删除等待项&#xff09;的并发安全* head&#xff1a;链表头&#xff0c;指向等待队列项的链表*/ typedef struct wait_queue_head …...

RISC-V开发工具链技术解析与选型指南

1. RISC-V开发工具链技术解析1.1 RISC-V生态发展背景随着处理器架构领域对开放性和灵活性的需求增长&#xff0c;RISC-V指令集架构凭借其开源特性获得了广泛关注。与传统架构相比&#xff0c;RISC-V免除了授权费用&#xff0c;降低了开发门槛&#xff0c;这使得芯片厂商和工具链…...

别再只调PWM了!深入Linux thermal框架,让你的风扇转速更‘聪明’

别再只调PWM了&#xff01;深入Linux thermal框架&#xff0c;让你的风扇转速更‘聪明’ 当你的服务器在深夜突然风扇狂转&#xff0c;或是笔记本在轻度使用时莫名发烫&#xff0c;单纯调整PWM占空比就像用锤子做精细手术——粗暴且低效。真正的高手都在thermal子系统的规则引擎…...

Vue3实战:5分钟搞定全局WebSocket封装(含心跳检测与断线重连)

Vue3全局WebSocket封装实战&#xff1a;心跳检测与断线重连的最佳实践 WebSocket在现代Web应用中扮演着越来越重要的角色&#xff0c;特别是在需要实时数据更新的场景中。Vue3作为当前最流行的前端框架之一&#xff0c;与WebSocket的结合能够为开发者提供强大的实时交互能力。本…...

如何高效解决Calibre中文路径翻译问题:完整实用指南

如何高效解决Calibre中文路径翻译问题&#xff1a;完整实用指南 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文&#xff08;中文&#xff09;命名 项目地址: htt…...

PowerPaint-V1 Gradio与VSCode集成开发:图像修复插件开发指南

PowerPaint-V1 Gradio与VSCode集成开发&#xff1a;图像修复插件开发指南 1. 开发环境准备 开始之前&#xff0c;我们需要准备好开发环境。VSCode作为代码编辑器&#xff0c;配合Python环境&#xff0c;可以让你更高效地开发PowerPaint-V1的图像修复插件。 首先确保你的系统…...

Release It! 终极自动化发布工具:5分钟配置完整版本管理流程

Release It! 终极自动化发布工具&#xff1a;5分钟配置完整版本管理流程 【免费下载链接】release-it &#x1f680; Automate versioning and package publishing 项目地址: https://gitcode.com/gh_mirrors/re/release-it Release It! 是一款强大的自动化发布工具&…...

AI 模型推理性能瓶颈与优化方向

AI模型推理性能瓶颈与优化方向 随着AI技术在各行业的广泛应用&#xff0c;模型推理性能成为影响落地效果的关键因素。无论是实时交互场景还是大规模数据处理&#xff0c;推理效率直接决定了用户体验和成本控制。受限于计算资源、算法复杂度及硬件适配性等因素&#xff0c;AI模…...

墨语灵犀处理时序数据实战:基于LSTM的预测模型辅助开发

墨语灵犀处理时序数据实战&#xff1a;基于LSTM的预测模型辅助开发 最近在做一个销量预测的项目&#xff0c;团队里新来的同事看着一长串的时序数据和复杂的LSTM模型代码&#xff0c;有点无从下手。他问我&#xff1a;“这些参数到底该怎么调&#xff1f;预测出来的曲线波动这…...

HsMod:炉石传说体验增强插件技术解析与应用指南

HsMod&#xff1a;炉石传说体验增强插件技术解析与应用指南 【免费下载链接】HsMod Hearthstone Modify Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod作为基于BepInEx框架开发的炉石传说插件&#xff0c;通过非侵入式技术手段重构游…...