手机网站集成支付宝,南京手机网站设计公司,网站开发项目介绍ppt,php语言 网站建设目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online
业务层代码
#include chatservice.hpp
#include public.hpp
#include string
#include muduo/base/Loggi… 目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online
业务层代码
#include chatservice.hpp
#include public.hpp
#include string
#include muduo/base/Logging.h
#include muduo/net/TcpServer.h
#include muduo/net/EventLoop.h
using namespace muduo;
using namespace std;//获取单例对象的接口函数
ChatService* ChatService::instance()
{static ChatService service;return service;
}//注册消息以及对应的Handler回调操作
ChatService::ChatService()
{//要想实现回调就需要先进行注册通过绑定对象_msgHandlerMap.insert({LOGIN_MSG,std::bind(ChatService::login,this,_1,_2,_3)});_msgHandlerMap.insert({REG_MSG,std::bind(ChatService::reg,this,_1,_2,_3)});}//获取消息对应的处理器
MsgHandler ChatService::getHandler(int msgid)
{//记录错误日志,msgid没有对应的事件处理回调auto it_msgHandlerMap.find(msgid);if(it_msgHandlerMap.end()){//返回一个默认的处理器空操作return [](auto a,auto b,auto c){LOG_ERRORmsgid:msgidcan not find handler!;};}else{return _msgHandlerMap[msgid];}}//处理登录业务
void ChatService::login(const TcpConnectionPtr conn,json js,Timestamp)
{int idjs[id].getint();string pwdjs[password];User user_userModel.query(id);if(user.getId()iduser.getPwd()pwd){if(user.getState()online){//该用户已经登录不允许重复登录json response;response[msgid]LOGIN_MSG_ACK;response[errno]2;response[errmsg]该账号已经登录请重新输入新账号;conn-send(response.dump());}else{//登录成功更新用户状态信息 state offlineonlineuser.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]用户名或者密码错误;conn-send(response.dump());}
}
//处理注册业务
void ChatService::reg(const TcpConnectionPtr conn,json js,Timestamp)
{string namejs[name];string pwdjs[password];User user;user.setName(name);user.setPwd(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());}
}
数据模型层代码
//更新用户的状态信息
//根据用户号码查询用户信息
bool UserModel::updateState(User user)
{//组装sql语句char sql[1024]{0};sprintf(sql,update user set state %s where id%d,user.getState().c_str(),user.getId());MySQL mysql;if(mysql.connect()) {if(mysql.update(sql)){return true;}}}但是问题就是一登录成功就断开连接了
记录用户的连接信息以及线程安全问题
所以需要保存连接信息
这个表会被多线程访问所以要考虑它的线程安全问题 上互斥锁 CSTL里面并没有考虑线程安全问题 数据库的增删改查的并发操作是由MYSQL来保证的不需要担心去上锁啥的。而线程安全需要保证 大括号表示作用域
客户端异常退出业务
在没有任何响应的情况下连接突然断开了。比如网络连接问题 如果异常退出并没有发送合法的json。用户状态如何 这个业务完成两件事一个是把存储用户通信连接的哈希表删除该用户的键值对2、将用户在数据库里的状态信息由online变成offline。 当出了大括号之后锁就自动释放