[集群聊天服务器]----(五)User类、UserModel类

2024-05-25 08:52

本文主要是介绍[集群聊天服务器]----(五)User类、UserModel类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接着上文[集群聊天服务器]----(四)MySQL数据库模块,接下来我们对User类、UserModel类进行剖析,User表和UserModel类是项目最基本也是最重要的部分,通过它我们对用户的id,用户名,密码,状态相关信息进行存储,也决定了登录成功与否以及后续的聊天等内容。

User表设计

在这里插入图片描述
创建 User 类:

#ifndef USER_H
#define USER_H#include <string>
using namespace std;//匹配user表的ORM类
class User {
public:User(int id=-1,string name="", string pwd="",string state="offline"){this->id=id;this->name=name;this->password=password;this->state=state;}void setId(int id) {this->id=id;}void setName(string name) {this->name=name;}void setPwd(string password) {this->password=password;}void setState(string state) {this->state=state;}int getId() {return this->id;}string getName() {return this->name;}string getPwd() {return this->password;}string getState() {return this->state;}private:int id;string name;string password;string state;};#endif
  • 由于user的id是填入表格以后,数据库自动创建的,所以初始时赋予-1,并提供了设置/获取id,用户名,用户密码,用户状态的相关函数。

创造UserModel类对User表进行数据操作

成员函数

    //user表的增加方法bool insert(User &user);//根据用户号码查询用户信息 User query(int id);//更新用户的状态信息bool updateState(User &user);//重置用户的状态信息void resetState();

user表的增加方法

 bool UserModel::insert(User &user){//组装sql语句char sql[1024] = {0};sprintf(sql,"insert into user(name,password,state) values('%s','%s','%s')",user.getName().c_str(),user.getPwd().c_str(),user.getState().c_str()); MySQL mysql;//连接数据库if(mysql.connect()){//更新数据库语句if(mysql.update(sql)){//获取插入成功的用户数据生成的主键iduser.setId(mysql_insert_id(mysql.getConnection()));return true;}}return false;
}
  • 首先组装sql语句;
  • 创建数据库对象,并连接数据库,根据sql语句进行更新user表,其中user为表格名字,user()括号中的为要插入的内容标题,values为对应的值,注意,表格名字以及对应的内容标题一定要和表格对应,否则插入失败
  • 更新成功会生成用户id,调用mysql_insert_id()函数在user中进行设置,(mysql.getConnection()作用是获取mysql的连接

根据用户号码查询用户信息

User UserModel::query(int id)
{char sql[1024] = {0};sprintf(sql,"select * from user where id =%d",id);MySQL mysql;//连接数据库if(mysql.connect()){//更新数据库语句MYSQL_RES *res = mysql.query(sql); //指针 内部动态内存开辟 需要释放资源if(res != nullptr){//获取行 根据主键查MYSQL_ROW row = mysql_fetch_row(res);if(row != nullptr){User user;user.setId(atoi(row[0]));user.setName(row[1]);user.setPwd(row[2]);user.setState(row[3]);mysql_free_result(res);return user;}}}return User();
}
  • 组装sql语句,select * from user where id =%d是对user进行查找id;
  • 连接数据库,并根据sql语句调用mysql_use_result()函数(属于MYSQL_RES类型)逐行进行查询,在调用mysql_fetch_row()读取结果;
  • 创建一个User对象,并根据查找结果设置其相应值,返回User对象
  • 注意res为内部动态内存开辟,需要释放资源

更新用户的状态信息

bool UserModel::updateState(User &user)
{char sql[1024] = {0};sprintf(sql,"update user set state = '%s' where id = %d",user.getState().c_str(),user.getId()); MySQL mysql;//连接数据库if(mysql.connect()){//更新数据库语句if(mysql.update(sql)){return true;}}return false;
}
  • 组装sql语句,根据id,更新 user表中的状态;
  • 连接数据库进行更新

重置用户的状态信息

void UserModel::resetState()
{char sql[1024] = "update user set state = 'offline' where state = 'online'";MySQL mysql;//连接数据库if(mysql.connect()){//更新数据库语句mysql.update(sql);}}
  • 组装sql语句,这个函数主要是针对捕捉到服务器ctrl+c异常结束后,重置user的状态信息,将表格中online用户的状态都改为offline;
  • 连接数据库进行更新

好了~ 关于集群聊天服务器中的User类和UserModel类的剖析就到此结束了,接下来我们将进入业务模块正题,用户注册、登录、退出以及客户端异常退出回调函数,下一节见~

这篇关于[集群聊天服务器]----(五)User类、UserModel类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001042

相关文章

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统