通过 JSON 对象的
toid
找寻对话用户
- 用户处于登录状态:直接向该用户发送信息
- 用户处于离线状态:需存储离线消息
// 一对一聊天业务
void ChatService::oneChatHandler(const TcpConnectionPtr &conn, json &js, Timestamp time)
{
// 需要接收信息的用户ID
int toId = js["toid"].get<int>();
{
lock_guard<mutex> lock(_connMutex);
auto it = _userConnMap.find(toId);
// 确认是在线状态
if (it != _userConnMap.end())
{
// TcpConnection::send() 直接发送消息
it->second->send(js.dump());
return;
}
}
// toId 不在线则存储离线消息
_offlineMsgModel.insert(toId, js.dump());
}
聊天服务测试
输出信息比较紧密,有点费眼。我分别登录了
li si
和
liu shuo
这两个用户,然后分别发送信息。可以看到都接收到了对方的信息。注意此时是在线消息的测试。
离线消息的测试:我让
liu shuo
下线,然后让
li si
给他发消息。然后观察数据库是否存储了离线消息。观察最后一行发现,最后确实储存了
li si
发给
liu shuo
的离线消息。
再次登录
liu shuo
的账号,查看是否会收到离线消息。发现
liu shuo
登录的时候确实收到了信息。
而这条离线信息也会从数据库中删除
版权声明:本文为weixin_46272577原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。