CPP集群聊天服务器开发实践(二):点对点聊天和添加好友

目录

1 点对点聊天实现思想

2 离线消息推送实现思想

3 服务器异常退出(ctrl+c)实现思想

4 添加好友实现思想


1 点对点聊天实现思想

主要实现思想是利用map保存用户id以及对应的connection,当客户端发起点对点聊天时,需要进行以下工作:

  1. 从json消息中提取对方id
  2. 查询 _userConnMap查看用户是否在线( _userConnMap中只保存在线的用户id和conn)
  3. 如果在线,则服务器推送发送的消息
  4. 如果不在线,则将离线消息保存到数据库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 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值