处理客户端异常退出业务代码和测试

106 阅读1分钟

我们要处理一下客户端的异常退出,客户端在没有任何响应的情况下,直接异常退出了,它在目前的代码下,退出没有合法的json字符串请求,而只是网络连接断开了,我们需要修改用户的状态为offline

1. 修改一下src/server/chatserver.cpp里的处理连接的onConnection方法

image.png

2. 在include/server/chatservice.hpp中添加处理客户端异常退出的方法clientCloseException

image.png

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. 编译测试

编译一下,开始测试处理客户端异常退出的情况

image.png

启动服务器,发送登录消息

image.png

查询user表

image.png

异常退出客户端

image.png 再查询user表,验证用户zhang san的状态是否被还原成offline

image.png