服务器端应检测到客户端是否异常退出,因此本节来实现客户端异常退出,项目流程见后文
一、客户端异常退出业务流程
(1)在业务模块定义处理客户端异常退出的函数
(2)集群聊天服务器项目(八)提到,哈希表_userConnMap存储用户的id和通信连接,若客户端异常退出,表示该客户端登录用户已经下线,那么需要对_userConnMap中对应用户的在线连接进行删除。由于_userConnMap是线程不安全的,操纵需加互斥锁访问。
(3)依次遍历哈希表_userConnMap,判断是否有通信连接同退出的客户端连接一致
若一致,则依据通信连接对应的用户id,删除_userConnMap中通信连接
由于客户端异常退出,表示登录用户已经下线,更新用户状态为offline
二、客户端异常退出业务代码实现
在include/server/chatservice.hpp中创建public公有权限函数,处理客户端异常退出服务
#ifndef CHATSERVICE_H
#define CHATSERVICE_H
#include <muduo/net/TcpConnection.h>
#include <unordered_map>//一个消息ID映射一个事件处理
#include <functional>
#include <mutex>
using namespace std;
using namespace muduo;
using namespace muduo::net;
#include "usermodel.hpp"
#include "json.hpp"
using json = nlohmann::json;
//表示处理消息的事件回调方法类型,事件处理器,派发3个东西
using MsgHandler = std::function<void(const TcpConnectionPtr &conn, json &js, Timestamp)>;
//聊天服务器业务类
class ChatService
{
public:
//获取单例对象的接口函数
static ChatService *instance();
//处理登录业务
void login(const TcpConnectionPtr &conn, json &js, Timestamp time);
//处理注册业务
void reg(const TcpConnectionPtr &conn, json &js, Timestamp time);
//处理客户端异常退出
void clientCloseException(const TcpConnectionPtr &conn);
//获取消息对应的处理器
MsgHandler getHandler(int msgid);
private:
ChatService();//单例
//存储消息id和其对应的业务处理方法,消息处理器的一个表,写消息id对应的处理操作
unordered_map<int, MsgHandler> _msgHandlerMap;
//存储用户的通信连接
unordered_map<int,TcpConnectionPtr> _userConnMap;
//定义互斥锁,保证_userConnMap的线程安全
mutex _connMutex;
//数据操作类对象
UserModel _userModel;
offlineMsgModel _offlineMsgModel;
};
#endif
在chatservice.cpp中进行实现
// 处理客户端异常退出
void ChatService::clientCloseException(const TcpConnectionPtr &conn)
{
User user;
{
lock_guard<mutex> lock(_connMutex);
for (auto it = _userConnMap.begin(); it != _userConnMap.end(); it++)
{
if (it->second == conn)
{
user.setId(it->first);
// 从map表中删除用户的连接信息
_userConnMap.erase(it);
break;
}
}
}
// 更新用户的状态信息
if (user.getId() != -1)
{
user.setState("offline");
_userModel.updateState(user);
}
}
三、功能验证
启动ChatServer服务器程序
查看数据库用户当前状态
所有用户均不在线
使用张三的账号进行登录,可以发现张三登录成功,底层数据库显示在线
张三用户异常退出,可以看到成功捕获到退出信息了,并在数据库中进行操作
查看数据库,发现张三下线了
客户端异常退出业务验证成功!
如果有问题,还请及时联系我,感谢大家的批评与指正!谢谢~
项目流程
1、项目环境搭建
C++项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置_c++集群聊天服务器-CSDN博客
2、Json第三方库介绍
C++项目——集群聊天服务器项目(二)Json第三方库-CSDN博客
3、muduo网络库介绍
C++项目——集群聊天服务器项目(三)muduo网络库-CSDN博客
4、MySQL数据库创建
C++项目——集群聊天服务器项目(四)MySQL数据库-CSDN博客
5、网络模块与业务模块代码编写
C++项目——集群聊天服务器项目(五)网络模块与业务模块-CSDN博客
6、MySQL模块编写
C++项目——集群聊天服务器项目(六)MySQL模块-CSDN博客
7、Model层设计、注册业务实现
C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现-CSDN博客
8、用户登录业务文章来源:https://www.toymoban.com/news/detail-854021.html
C++项目——集群聊天服务器项目(八)用户登录业务-CSDN博客文章来源地址https://www.toymoban.com/news/detail-854021.html
到了这里,关于C++项目——集群聊天服务器项目(九)客户端异常退出业务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!