首页 > 编程语言 >C++聊天集群服务器5

C++聊天集群服务器5

时间:2023-12-01 21:34:08浏览次数:44  
标签:string int 群组 userid C++ 集群 user 服务器 id

一、服务器异常处理函数

​ 这部分主要处理服务器异常退出时,用户的在线状态还是online不会改变,因此需要修改。由于是需要对用户进行操作,因此我们在user表的数据操作类添加重置用户状态函数。

​ 在usermodel.hpp添加后:

#ifndef USERMODEL_
#define USERMODEL_

#include "user.hpp"

//User表的数据操作类
class UserModel
{
public:
    //User表的增加方法
    bool insert(User &user);

    //根据用户号码查询用户信息
    User query(int id);

    //更新用户状态信息
    bool updateState(User user);

    //重置用户信息
    void resetState();
};

#endif

​ 实现:

// 重置用户信息
void UserModel::resetState()
{
    // 1.组装sql语句
    char sql[1024] = "update user set state = 'offline' where state = 'online';";

    MySQL mysql;
    if (mysql.connect())
    {
        mysql.update(sql);
    }
}

​ 在service层添加函数调用model层代码并实现:

image-20231201210959223

image-20231201211012292

​ 然后在主函数注册信号(目前只实现了服务器端ctrl+c)并捕捉:

image-20231201211158396

​ 这样当服务器端按下ctrl+c就会被捕捉然后触发reserHandler函数。

二、添加好友业务函数

​ 在service层添加消息信号,并添加相应的处理函数handler:

image-20231201211430989

image-20231201211444884

​ 在service层添加函数:

image-20231201211609702

​ 实现:

image-20231201211641311

​ 这里就需要一个新的model层,friendmodel实现如下:

image-20231201211737413

​ cpp代码:

#include "friendmodel.hpp"
#include "db.h"


// 添加好友关系
void FriendModel::insert(int userid, int friendid)
{
    //1.组装sql语句
    char sql[1024]={0};
    sprintf(sql,"insert into friend values(%d,%d);",userid,friendid);
    
    MySQL mysql;
    if(mysql.connect())
    {
        mysql.update(sql);
    }
}

// 返回用户好友列表  friendid
vector<User> FriendModel::query(int userid)
{
    //1.组装sql语句
    char sql[1024]={0};
    sprintf(sql,"select a.id,a.name,a.state from user a inner join friend b on b.friendid = a.id where b.userid = %d;",userid);
    
    vector<User> vec;

    MySQL mysql;
    if(mysql.connect())
    {
        MYSQL_RES* res = mysql.query(sql);

        if(res != nullptr)
        {
            MYSQL_ROW row;
            //把userid用户的所有离线消息放入数组,返回
            while((row = mysql_fetch_row(res)) != nullptr)
            {
                User user;
                user.setId(atoi(row[0]));
                user.setName(row[1]);
                user.setState(row[2]);
                vec.push_back(user);
            }

            mysql_free_result(res);
        }
    }
    return vec;
}

三、群组业务开发

​ service层添加函数:

image-20231201211842493

​ 实现:

// 创建群组业务
void ChatService::createGroup(const TcpConnectionPtr &conn, json &js, Timestamp time)
{
    int userid = js["id"].get<int>();
    string name = js["groupname"];
    string desc = js["groupdesc"];

    // 存储新创建的群组信息
    Group group(-1, name, desc);
    if (_groupModel.createGroup(group))
    {
        // 存储群组创建人信息
        _groupModel.addGroup(userid, group.getId(), "creator");
    }
}
// 加入群组业务
void ChatService::addGroup(const TcpConnectionPtr &conn, json &js, Timestamp time)
{
    int userid = js["id"].get<int>();
    int groupid = js["groupid"].get<int>();

    _groupModel.addGroup(userid, groupid, "normal");
}

// 群组聊天业务
void ChatService::groupChat(const TcpConnectionPtr &conn, json &js, Timestamp time)
{
    int userid = js["id"].get<int>();
    int groupid = js["groupid"].get<int>();

    vector<int> useridVec = _groupModel.queryGroupUsers(userid,groupid);

    lock_guard<mutex> lock(_connMutex);
    for(int id : useridVec)
    {
        auto it = _userConnMap.find(id);
        if(it != _userConnMap.end())
        {
            //在线转发消息
            it->second->send(js.dump());
        }
        else
        {
            //离线,存储消息
            _offlineMsgModel.insert(id,js.dump());
        }
    }
}

​ model层增加群定义:

​ group.hpp:

#ifndef GROUP_H
#define GROUP_H

#include "groupuser.hpp"
#include <string>
#include <vector>

using namespace std;

class Group
{
public:
    Group(int id = -1,string name = "",string desc = "")
    {
        this->desc=desc;
        this->name=name;
        this->id=id;
    }

    void setId(int id){this->id=id;};
    void setName(string name){this->name = name;};
    void setDesc(string desc){this->desc = desc;};

    int getId(){return this->id;};
    string getName(){return this->name;};
    string getDesc(){return this->desc;};

    vector<GroupUser> &getUSers(){return this->users;};
private:
    int id;
    string name;
    string desc;    
    vector<GroupUser> users;
};

#endif

​ groupmodel.hpp:

#ifndef GROUPMODEL_H
#define GROUPMODEL_H

#include "group.hpp"
#include <string>
#include <vector>
using namespace std;

class GroupModel
{
public:
    //创建群组
    bool createGroup(Group &group);    
    //加入群组
    void addGroup(int userid,int groupid,string role);
    //查询用户所在群组信息
    vector<Group>  queryGroups(int userid);
    //根据groupid查询群组用户id列表,除userid,主要用来发群聊消息
    vector<int> queryGroupUsers(int userid,int groupid);
};


#endif

​ groupuser继承自user因为只是增加了一个role成员,群组角色:

#ifndef GROUPUSER_H
#define GROUPUSER_H

#include "user.hpp"

class GroupUser : public User
{
public:
    void setRole(string role){this->role = role;};
    string getRole(){return this->role;};

private:
    string role;
};



#endif

标签:string,int,群组,userid,C++,集群,user,服务器,id
From: https://www.cnblogs.com/dwinternet/p/17870902.html

相关文章

  • C++学习笔记——函数探幽
    C++内联函数内联函数是一种用空间换时间的技术,是C++提高程序运行速度做的改进。运行程序时操作系统将指令载入计算机内存中,并逐条执行这些指令,遇到循环或分支时向前或向后跳转到特定的地址(每条指令都有特定的内存地址)。常规函数也是如此,在调用常规函数时立即存储该指令的地址......
  • error: Microsoft Visual C++ 14.0 or greater is required
    1、错误背景python在安装aiohttp库时,出现MicrosoftVisualC++14.0orgreaterisrequired的提示:2、解决方案按照错误提示,访问https://visualstudio.microsoft.com/visual-cpp-build-tools/,下载生成工具:执行下载的exe执行文件:选择使用C++桌面开发,选......
  • .NET Core|--调用C++库|--docker环境下让web api应用程序调用C++类库
    前言#前提安装docker环境~启动docker~#多说一句,为什么我要搞这个一个镜像,既包含gcc开发环境,又包含.NET开发环境我的api应用程序是基于.NET写的,但是我的这个api程序,又要调用c++的一些东西,特别是涉及一些画图之类的,所以就需要gcc的开发环境,最终搞了这么一......
  • k8s集群部署nginx服务以及外网访问nginx服务
    1、查看k8s进群状态[root@k8s-mastertest]#kubectlgetnodeNAMESTATUSROLESAGEVERSIONk8s-masterReadymaster16dv1.15.1k8s-node1Ready<none>16dv1.15.12、编写nginx服务yaml文件kind:NamespaceapiVersion:v1metad......
  • hadoop高可用集群集成hive
    hive和hadoop的关系从上图可以看出实际上外界是通过thriftserver这个节点和hadoop的hdfs以及rm进行交互的,中间为driver因此当我修改完hadoop集群为高可用的时候,hive也需要重新配置环境以下是我hive的全新配置<configuration><!--Hive元数据存储配置--><propert......
  • 编译C++程序调用dll的方法
    在拥有.cpp源文件的情况下,调用其它dll并生成exe的方法第一步:新建C++空项目。 第二步:将源文件放到项目根目录路径下,并在项目的源文件下添加现有项,将源文件添加进项目。第三步:在项目根目录下创建include文件夹,将需要被调用的dll的.h头文件放入该文件夹。第四步:在项目根目......
  • Linux:查看MobaXterm已保存的服务器密码
    打开MobaXterm,Settings-->Configuration-->General--> MobaXtermpasswordsmanagement,选择需要查看的Session所在行,点击“Showpasswords”,弹出MobaXterm密码输入框......
  • C++异步编程
    关键词//都会返回一个std::future,用来提供执行结果std::async、std::paclaged_task、std::promise知识点1、std::future<>():a).std::future的临时对象在调用析构函数时会阻塞当前线程。注意在局部区域内的std::future的析构。b).std::future::get()和std::future::wait()......
  • Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio
    Gradio是一个经常用于创建交互式机器学习应用的Python库。在以前按照传统方法,如果想对外分享Gradio应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好。欢迎Gradio-lite(@gradio/lite):一个通过Pyodide在浏览器中直接运行Gradio的库。在......
  • ubuntu部署gitlab服务器
    ubuntu部署gitlab服务器笔者使用的ubuntu版本为20.04,gitlab版本为16.2.1(此篇文章部分引用他人文件,单纯记录,如有侵权请联系)1、更新命令cd/homemkdirgitlabcd/gitlabsudoaptupdatesudoapt-getupgradesudoapt-getinstallcurlopenssh-serverca-certificates......