C++搭建集群聊天室(十):登錄與注冊

      網友投稿 764 2022-05-30

      前面準備了那么多,這里就直接是水到渠成了。

      該講的前面都講的差不多了,剩下還沒講的都在代碼里面。

      不過由于文檔Telnet一直是發送不了數據的狀態,就一直沒法進一步的測試,等后面寫了客戶端再說。

      C++搭建集群聊天室(十):登錄與注冊

      chatservice.hpp

      #ifndef CHATSERVICE_H_ #define CHATSERVICE_H_ #include #include #include #include #include "json.hpp" #include "usermodel.hpp" using json = nlohmann::json; using namespace std; using namespace muduo; using namespace muduo::net; //處理消息的事件回調方法類型 using MsgHandler = std::function; //聊天服務器業務 class ChatService{ public: //單例模式 static ChatService* instance(); void login(const TcpConnectionPtr &conn,json &js,Timestamp time); void reg(const TcpConnectionPtr &conn,json &js,Timestamp time); //獲取消息對應的處理器 MsgHandler getHandle(int msgid); private: ChatService(); //存儲消息id和對應的處理方法 unordered_map _msgHanderMap; //存儲在線用戶連接 unordered_map _userConnMap; //數據操作類的對象 UserModel _usermodel; //定義互斥鎖 mutex _connMutex; }; #endif

      chatservice.cpp

      #include"chatservice.hpp" #include"public.hpp" #include #include using namespace std; using namespace muduo; ChatService* ChatService::instance(){ static ChatService service; return &service; } //注冊消息以及對應的回調操作 ChatService::ChatService(){ _msgHanderMap.insert({LOGIN_TYPE,std::bind(&ChatService::login,this,_1,_2,_3)}); _msgHanderMap.insert({REG_TYPE,std::bind(&ChatService::reg,this,_1,_2,_3)}); } //獲取存儲消息id和對應的處理方法 MsgHandler ChatService::getHandle(int msgid){ //日志記錄 auto it = _msgHanderMap.find(msgid); if(it == _msgHanderMap.end()){ //返回一個lambda表達式,返回一個默認的空處理器,防止業務掛掉,后可做平滑升級處理 return [=](const TcpConnectionPtr &conn,json &js,Timestamp time){ LOG_ERROR<<"msgid:"<(); string pwd = js["password"]; User user = _usermodel.query(id); if (user.getID() == id && user.getpassword() == pwd) { if (user.getstate() == "online") { // 該用戶已經登錄,不允許重復登錄 json response; response["msgid"] = LOGIN_MSG_ACK; response["errno"] = 2; response["errmsg"] = "this account is using, input another!"; conn->send(response.dump()); } else { //添加作用域,限制鎖的粒度 { lock_guard lock(_connMutex); //記錄用戶連接 _userConnMap.insert({id,conn}); } // 登錄成功,更新用戶狀態信息 state offline=>online user.setstate("online"); _usermodel.updateState(user); json response; response["msgid"] = LOGIN_MSG_ACK; response["errno"] = 0; response["id"] = user.getID(); response["name"] = user.getname(); conn->send(response.dump()); } } else { // 該用戶不存在,用戶存在但是密碼錯誤,登錄失敗 json response; response["msgid"] = LOGIN_MSG_ACK; response["errno"] = 1; response["errmsg"] = "id or password is invalid!"; conn->send(response.dump()); } } void ChatService::reg(const TcpConnectionPtr &conn,json &js,Timestamp time){ string name = js["name"]; string pwd = js["password"]; User _user; _user.setname(name); _user.setpassword(pwd); bool state = _usermodel.insert(_user); if(state){ //注冊成功 json response; response["msgid"] = REG_MSG_ACK; response["errno"] = 0; response["id"] = _user.getID(); conn->send(response.dump()); } else{ //注冊失敗 json response; response["msgid"] = REG_MSG_ACK; response["errno"] = 1; conn->send(response.dump()); } }

      C++

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Mysql主從復制配置
      下一篇:Java進階(三十一) Web服務調用
      相關文章
      亚洲另类激情综合偷自拍 | 亚洲人成依人成综合网| 国产成人 亚洲欧洲| 亚洲日韩精品无码专区加勒比☆| 亚洲国产日产无码精品| 亚洲国产精品热久久| 国产亚洲精品自在久久| 亚洲视频一区二区| 亚洲无码日韩精品第一页| 亚洲精品97久久中文字幕无码| jizzjizz亚洲日本少妇| 亚洲不卡AV影片在线播放| 亚洲色偷偷狠狠综合网| 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲综合伊人久久大杳蕉| 亚洲午夜久久久久久久久久| 亚洲中文字幕无码久久综合网| 亚洲精品少妇30p| 亚洲高清在线播放| 91亚洲精品自在在线观看| 精品亚洲AV无码一区二区三区| 亚洲字幕AV一区二区三区四区 | 亚洲乱妇熟女爽到高潮的片| 亚洲AV无码片一区二区三区| www亚洲一级视频com| 国产亚洲一区区二区在线 | 亚洲国产精品一区二区第一页| 亚洲激情中文字幕| 亚洲欧洲国产视频| 国产午夜亚洲精品| 337p日本欧洲亚洲大胆人人| 成人亚洲国产精品久久| 国产午夜亚洲精品午夜鲁丝片| 国产成人精品日本亚洲| 久久亚洲国产成人精品性色| 精品亚洲国产成人| 亚洲s码欧洲m码吹潮| 国内精品久久久久久久亚洲| 久久久久无码精品亚洲日韩| 亚洲国产精品yw在线观看| 亚洲熟妇AV乱码在线观看|