C++搭建集群聊天室

文章介绍了C++中的ChatService类,包括用户登录和注册操作的处理逻辑,使用了互斥锁(mutex)进行并发控制。重点展示了如何通过_msgHanderMap管理消息ID和对应的处理函数,以及登录函数中对用户状态的管理和验证过程。
摘要由CSDN通过智能技术生成

//数据操作类的对象

UserModel _usermodel;

//定义互斥锁

mutex _connMutex;

};

#endif


chatservice.cpp


#include"chatservice.hpp"

#include"public.hpp"

#include

#include<muduo/base/Logging.h>

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:”<<msgid<<“can not find handle!”;

};

}

else{

return _msgHanderMap[msgid];

}

}

void ChatService::login(const TcpConnectionPtr &conn,json &js,Timestamp time){

int id = js[“id”].get();

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());

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

送给每一位想学习Java小伙伴,用来提升自己。

在这里插入图片描述

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
va小伙伴,用来提升自己。

[外链图片转存中…(img-id13aMZA-1712564960964)]

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值