我们要处理一下客户端的异常退出,客户端在没有任何响应的情况下,直接异常退出了,它在目前的代码下,退出没有合法的json字符串请求,而只是网络连接断开了,我们需要修改用户的状态为offline
1. 修改一下src/server/chatserver.cpp里的处理连接的onConnection方法
2. 在include/server/chatservice.hpp中添加处理客户端异常退出的方法clientCloseException
3. 在include/server/chatservice.cpp中实现clientCloseException方法
这个方法需要在保存用户连接的_userConnMap中整表搜索,删除conn对应的键值对,并将数据库中conn对应的用户状态修改为offline
//处理客户端异常退出
void ChatService ::clientCloseException(const TcpConnectionPtr& conn)
{
User user;
{
lock_guard<mutex> lock(_connMutex);
for(auto it = _userConnMap.begin(); it != _userConnMap.end(); ++it)
{
if(it->second == conn)
{
//从map表删除用户的连接信息
user.setId(it->first);
_userConnMap.erase(it);
break;
}
}
}
//更新用户的状态信息
if(user.getId() != -1)
{
user.setState("offline");
_userModel.updateState(user);
}
}
4. 编译测试
编译一下,开始测试处理客户端异常退出的情况
启动服务器,发送登录消息
查询user表
异常退出客户端
再查询user表,验证用户zhang san的状态是否被还原成offline