目录
1 点对点聊天实现思想
主要实现思想是利用map保存用户id以及对应的connection,当客户端发起点对点聊天时,需要进行以下工作:
- 从json消息中提取对方id
- 查询 _userConnMap查看用户是否在线( _userConnMap中只保存在线的用户id和conn)
- 如果在线,则服务器推送发送的消息
- 如果不在线,则将离线消息保存到数据库offlinemessage
//存储在线用户的通信连接,用于服务器消息推送
unordered_map<int,TcpConnectionPtr> _userConnMap;
//一对一聊天业务
void ChatService::oneChat(const TcpConnectionPtr &conn,json &js,Timestamp time)
{
//从json消息获取对方id
int toid = js["to"].get<int>();
//查看是否在线,线程安全,同时需要保证我在转发消息时候connection不被移除(加锁)
{
lock_guard<mutex> lock(_connMutex);
auto it = _userConnMap.find(toid);
if(it!=_userConnMap.end()){
//toid在线,转发消息,服务器主动推送消息给toid用户
it->second->send(js.dump());
return;
}
}
//toid不在线,存储离线消息到数据库offlinemessage
_offlineMsgModel.insert(toid,js.dump());
}
由于可能存在connection多种资源同时使用的情况,防止服务器转发消息时connection会被客户端移除,因此需要加锁。
测试结果:
2 离线消息推送实现思想
离线消息保存在offlinemessage表中,主要包含以下表字段,由于字段比较少,因此只定义了offlinemessagemodel.cpp。
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| userid | int | NO | PRI |