服務(wù)器端應(yīng)檢測到客戶端是否異常退出,因此本節(jié)來實現(xiàn)客戶端異常退出,項目流程見后文
一、客戶端異常退出業(yè)務(wù)流程
(1)在業(yè)務(wù)模塊定義處理客戶端異常退出的函數(shù)
(2)集群聊天服務(wù)器項目(八)提到,哈希表_userConnMap存儲用戶的id和通信連接,若客戶端異常退出,表示該客戶端登錄用戶已經(jīng)下線,那么需要對_userConnMap中對應(yīng)用戶的在線連接進(jìn)行刪除。由于_userConnMap是線程不安全的,操縱需加互斥鎖訪問。
(3)依次遍歷哈希表_userConnMap,判斷是否有通信連接同退出的客戶端連接一致
若一致,則依據(jù)通信連接對應(yīng)的用戶id,刪除_userConnMap中通信連接
由于客戶端異常退出,表示登錄用戶已經(jīng)下線,更新用戶狀態(tài)為offline
二、客戶端異常退出業(yè)務(wù)代碼實現(xiàn)
在include/server/chatservice.hpp中創(chuàng)建public公有權(quán)限函數(shù),處理客戶端異常退出服務(wù)
#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;
//表示處理消息的事件回調(diào)方法類型,事件處理器,派發(fā)3個東西
using MsgHandler = std::function<void(const TcpConnectionPtr &conn, json &js, Timestamp)>;
//聊天服務(wù)器業(yè)務(wù)類
class ChatService
{
public:
//獲取單例對象的接口函數(shù)
static ChatService *instance();
//處理登錄業(yè)務(wù)
void login(const TcpConnectionPtr &conn, json &js, Timestamp time);
//處理注冊業(yè)務(wù)
void reg(const TcpConnectionPtr &conn, json &js, Timestamp time);
//處理客戶端異常退出
void clientCloseException(const TcpConnectionPtr &conn);
//獲取消息對應(yīng)的處理器
MsgHandler getHandler(int msgid);
private:
ChatService();//單例
//存儲消息id和其對應(yīng)的業(yè)務(wù)處理方法,消息處理器的一個表,寫消息id對應(yīng)的處理操作
unordered_map<int, MsgHandler> _msgHandlerMap;
//存儲用戶的通信連接
unordered_map<int,TcpConnectionPtr> _userConnMap;
//定義互斥鎖,保證_userConnMap的線程安全
mutex _connMutex;
//數(shù)據(jù)操作類對象
UserModel _userModel;
offlineMsgModel _offlineMsgModel;
};
#endif
在chatservice.cpp中進(jìn)行實現(xiàn)
// 處理客戶端異常退出
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;
}
}
}
// 更新用戶的狀態(tài)信息
if (user.getId() != -1)
{
user.setState("offline");
_userModel.updateState(user);
}
}
三、功能驗證
啟動ChatServer服務(wù)器程序
查看數(shù)據(jù)庫用戶當(dāng)前狀態(tài)
所有用戶均不在線
使用張三的賬號進(jìn)行登錄,可以發(fā)現(xiàn)張三登錄成功,底層數(shù)據(jù)庫顯示在線
張三用戶異常退出,可以看到成功捕獲到退出信息了,并在數(shù)據(jù)庫中進(jìn)行操作
查看數(shù)據(jù)庫,發(fā)現(xiàn)張三下線了
客戶端異常退出業(yè)務(wù)驗證成功!
如果有問題,還請及時聯(lián)系我,感謝大家的批評與指正!謝謝~
項目流程
1、項目環(huán)境搭建?
C++項目——集群聊天服務(wù)器項目(一)項目介紹、環(huán)境搭建、Boost庫安裝、Muduo庫安裝、Linux與vscode配置_c++集群聊天服務(wù)器-CSDN博客
2、Json第三方庫介紹
C++項目——集群聊天服務(wù)器項目(二)Json第三方庫-CSDN博客
3、muduo網(wǎng)絡(luò)庫介紹
C++項目——集群聊天服務(wù)器項目(三)muduo網(wǎng)絡(luò)庫-CSDN博客
4、MySQL數(shù)據(jù)庫創(chuàng)建
C++項目——集群聊天服務(wù)器項目(四)MySQL數(shù)據(jù)庫-CSDN博客
5、網(wǎng)絡(luò)模塊與業(yè)務(wù)模塊代碼編寫
C++項目——集群聊天服務(wù)器項目(五)網(wǎng)絡(luò)模塊與業(yè)務(wù)模塊-CSDN博客
6、MySQL模塊編寫
C++項目——集群聊天服務(wù)器項目(六)MySQL模塊-CSDN博客
7、Model層設(shè)計、注冊業(yè)務(wù)實現(xiàn)
C++項目——集群聊天服務(wù)器項目(七)Model層設(shè)計、注冊業(yè)務(wù)實現(xiàn)-CSDN博客
8、用戶登錄業(yè)務(wù)文章來源:http://www.zghlxwxcb.cn/news/detail-854021.html
C++項目——集群聊天服務(wù)器項目(八)用戶登錄業(yè)務(wù)-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-854021.html
到了這里,關(guān)于C++項目——集群聊天服務(wù)器項目(九)客戶端異常退出業(yè)務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!