(八)点对点聊天业务处理

  • Post author:
  • Post category:其他


通过 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 版权协议,转载请附上原文出处链接和本声明。