1.协议格式
一对一聊天
json["msgid"] = ONE_CHAT_MSG;
json["id"] //发送者id
json["name"] //发送者姓名
json["to"] //接受者id
json["msg"] //消息内容
json["time"] //发送时间
2.设计思路
服务端判断目的对象在不在线(查当前服务器的在线用户表,或者去数据库查当前用户是否在线),如果在本服务器上面直接转发数据,如果在其他服务器上面,进行发布信息即可,如果不在,就进行缓存到缓存表里面。
3.代码部分
// 一对一聊天业务
void ChatService::oneChat(const TcpConnectionPtr &conn, json &js, Timestamp time)
{
int toid = js["toid"].get<int>();
{
lock_guard<mutex> 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());
}