在凡科上做的网站无法加载出来,红色博客网站源码,任何东西都能搜出来的软件,公司网络营销策略接着[集群聊天服务器]----(六)业务模块之用户注册、登录、退出以及客户端异常退出函数中对于业务模块的用户注册、登录、退出以及客户端异常退出函数的剖析#xff0c;现在我们对点对点聊天以及添加好友的实现进行剖析。
点对点聊天
当客户端输入msgidONE_CHAT_MSG时#x…接着[集群聊天服务器]----(六)业务模块之用户注册、登录、退出以及客户端异常退出函数中对于业务模块的用户注册、登录、退出以及客户端异常退出函数的剖析现在我们对点对点聊天以及添加好友的实现进行剖析。
点对点聊天
当客户端输入msgidONE_CHAT_MSG时ChatService::ChatService()中会回调ChatService::oneChat()函数进行处理
void ChatService::oneChat(const TcpConnectionPtr conn, json js, Timestamp time)
{int toid js[toid].getint(); // 对方的id{//在一台主机上lock_guardmutex lock(_connMutex); // 线程安全auto it _userConnMap.find(toid);if (it ! _userConnMap.end()){// toid 在线 转发消息 服务器主动推送消息给toid用户it-second-send(js.dump());return;}}// 查询toid是否在线User user _userModel.query(toid);//在另一台电脑上if (user.getState() online){_redis.publish(toid, js.dump());return;}// toid 不在线 存储离线消息_offlineMsgModel.insert(toid, js.dump());
}通过 JSON 对象反序列结果寻找toid对应的值找到用户想要对话的用户并在_userConnMap中进行查找是否有此对象如果用户在一台主机并且处于在线状态就发送想要发送的消息如果不在同一台主机根据toid调用_userModel在user表中进行查看对方是否在线如果在线就通过redis发布消息不在线就存储其离线消息
添加好友
当客户端输入msgidADD_FRIEND_MSG时ChatService::ChatService()中会回调ChatService::addFriend()函数进行处理
void ChatService::addFriend(const TcpConnectionPtr conn, json js, Timestamp time)
{int userid js[id].getint();int friendid js[friendid].getint();// 存储好友信息_friendModel.insert(userid, friendid);
}根据客户端获取的用户id以及想要添加的好友id在好友表中进行存储
好友消息FriendModel
//添加好友关系
void insert(int userid, int friendid);//返回用户好友列表 friendidfriendname id
vectorUser query(int userid);添加好友关系
void FriendModel::insert(int userid, int friendid)
{char sql[1024] {0};sprintf(sql, insert into friend values(%d,%d), userid, friendid);MySQL mysql;// 连接数据库if (mysql.connect()){// 更新数据库语句mysql.update(sql);}
}组装sql语句根据用户id以及好友id userid, friendid在friend表中进行更改
返回用户好友列表
vectorUser FriendModel::query(int userid)
{char sql[1024] {0};sprintf(sql, select a.id,a.name,a.state from user a inner join friend b on b.friendid a.id where b.userid%d, userid);vectorUser vec;MySQL mysql;// 连接数据库if (mysql.connect()){MYSQL_RES *res mysql.query(sql); if (res ! nullptr){MYSQL_ROW row ;while((row mysql_fetch_row(res)) ! nullptr) {User user;user.setId(atoi(row[0]));user.setName(row[1]);user.setState(row[2]);vec.push_back(user);}mysql_free_result(res);return vec;}}return vec;}组装sql语句根据userid在user 和 friend表进行联合查询好友的id name state根据sql语句调用MySQL::query()语句进行查找好友然后调用mysql_fetch_row()函数查找对应的行row是MYSQL_ROW类型可以根据下标找到对应的值并把id name state放入vec中返回注意释放资源
离线消息类OfflineMsgModel
//存储用户的离线消息
void insert(int userid, string msg);//删除用户的离线消息
void remove(int userid);//查询用户的离线消息
vectorstring query(int userid);存储用户的离线消息
void OfflineMsgModel::insert(int userid, string msg)
{char sql[1024] {0};sprintf(sql, insert into offlinemessage values(%d,%s), userid, msg.c_str());MySQL mysql;// 连接数据库if (mysql.connect()){// 更新数据库语句mysql.update(sql);}
}
组装sql语句根据userid像offlinemessage表中添加离线消息msg连接数据库并进行更新
删除用户的离线消息
在用户登录以后需要显示离线消息并删除用户的离线消息表
void OfflineMsgModel::remove(int userid)
{char sql[1024] {0};sprintf(sql, delete from offlinemessage where userid%d, userid);MySQL mysql;// 连接数据库if (mysql.connect()){// 更新数据库语句mysql.update(sql);}
}组装sql语句根据userid在offlinemessage表中删除相关消息连接数据库并进行更新
查询用户的离线消息
vectorstring OfflineMsgModel::query(int userid)
{char sql[1024] {0};sprintf(sql, select message from offlinemessage where userid %d, userid);vectorstring vec;MySQL mysql;// 连接数据库if (mysql.connect()){// 更新数据库语句MYSQL_RES *res mysql.query(sql); // 指针 内部动态内存开辟 需要释放资源if (res ! nullptr){// 获取行 根据主键查//把userid用户的所有离线消息放入vec中返回MYSQL_ROW row ;while((row mysql_fetch_row(res)) ! nullptr) {vec.push_back(row[0]);}mysql_free_result(res);return vec;}}return vec;
}组装sql语句根据userid在offlinemessage表查找离线消息根据sql语句调用MySQL::query()语句进行查找好友然后调用mysql_fetch_row()函数查找对应的行row是MYSQL_ROW类型可以根据下标找到对应的值并把离线消息放入vec中返回注意释放资源
好了~ 关于业务模块的一对一聊天、添加好友函数、好友类以及离线消息类的剖析就到此结束了下一节我们将对群组进行剖析下一节见~~