2.5.C++项目:网络版五子棋对战之数据管理模块-在线用户管理模块的设计

在这里插入图片描述

一、意义

在线用户管理,是对于当前游戏大厅和游戏房间中的用户进行管理,主要是建立起用户与Socket连接的映射关系。

二、功能

能够让程序中根据用户信息,进而找到能够与用户客户端进行通信的Socket连接,进而实现与用户端的通信。
判断⼀个用户是否在线,或者判断判断⼀用户是否在线,或者判断用户是否已经掉线。

三、作用

当一个用户发送了消息(实时聊天消息/下棋消息),我们可以找到房间中的其它用户,在在线用户管理模块中,找到这个用户对应的websocket连接,然后将消息发给指定用户。

  1. 通过用户id找到用户连接,进而实现向指定用户的客户端推送消息,websocket连接失败时,会自动在在线用户管理模具爱中删除自己的信息!
  2. 可以判断一个用户是否还在用户管理模块中来确认用户是否在线!

四、基本设计

class online_manager {
    private:
        std::mutex _mutex;
        std::unordered_map<uint64_t,websocket_server::connection_ptr> _hall_user; // 游戏大厅
        std::unordered_map<uint64_t,websocket_server::connection_ptr> _room_user; // 游戏房间
    public:
        // websocket连接建立的时候才会加入游戏大厅&游戏房间在线用户管理
        bool enter_game_hall(uint64_t uid,websocket_server::connection_ptr &conn);
        bool enter_game_room(uint64_t uid,websocket_server::connection_ptr &conn);
        //websocket连接断开的时候,才会移除游戏大厅&游戏房间在线用户管理
        bool exit_game_hall(uint64_t uid,websocket_server::connection_ptr &conn);
        bool enter_game_room(uint64_t uid,websocket_server::connection_ptr &conn);
        //判断当前指定用户是否在游戏大厅/游戏房间
        bool is_in_game_hall(uint64_t);
        bool is_in_game_room(uint64_t);
        //通过用户ID在游戏大厅/游戏房间用户管理中获取对应的通信连接
        wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid);
        wsserver_t::connection_ptr get_conn_from_room(uint64_t uid);
};

五、完整代码

// 在线用户管理:
//     管理的是两类用户:进入游戏大厅的& 进入游戏房间的
//     原因:进入游戏大厅的用户和进入游戏房间的用户才会建立wobsocketv长链接
//     管理:将用户id和对应的客户端webscoket长连接关联起来!
//     作用:当一个用户发送了消息(实时聊天消息/下棋消息),我们可以找到房间中的其它用户,在在线用户管理模块中,找到这个用户对应的websocket连接,然后将消息发给指定用户。
//     1. 通过用户id找到用户连接,进而实现向指定用户的客户端推送消息,websocket连接失败时,会自动在在线用户管理模具爱中删除自己的信息!
//     2. 可以判断一个用户是否还在用户管理模块中来确认用户是否在线!

#ifndef __M_ONLINE_H__
#define __M_ONLINE_H__
#include "util.hpp"
#include <mutex>
#include <unordered_map>

class online_manager{
   private:
        std::mutex _mutex;
        //用于建立游戏大厅用户的用户ID与通信连接的关系
        std::unordered_map<uint64_t,  wsserver_t::connection_ptr>  _hall_user;
        //用于建立游戏房间用户的用户ID与通信连接的关系
        std::unordered_map<uint64_t,  wsserver_t::connection_ptr>  _room_user;
   public:
        //websocket连接建立的时候才会加入游戏大厅&游戏房间在线用户管理
        void enter_game_hall(uint64_t uid,   wsserver_t::connection_ptr &conn) {
            std::unique_lock<std::mutex> lock(_mutex);
            _hall_user.insert(std::make_pair(uid, conn));
        }
        void enter_game_room(uint64_t uid,   wsserver_t::connection_ptr &conn) {
            std::unique_lock<std::mutex> lock(_mutex);
            _room_user.insert(std::make_pair(uid, conn));
        }
        //websocket连接断开的时候,才会移除游戏大厅&游戏房间在线用户管理
        void exit_game_hall(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            _hall_user.erase(uid);
        }
        void exit_game_room(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            _room_user.erase(uid);
        }
        //判断当前指定用户是否在游戏大厅/游戏房间
        bool is_in_game_hall(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            auto it = _hall_user.find(uid);
            if (it == _hall_user.end()) {
                return false;
            }
            return true;
        }
        bool is_in_game_room(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            auto it = _room_user.find(uid);
            if (it == _room_user.end()) {
                return false;
            }
            return true;
        }
        //通过用户ID在游戏大厅/游戏房间用户管理中获取对应的通信连接
        wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            auto it = _hall_user.find(uid);
            if (it == _hall_user.end()) {
                return wsserver_t::connection_ptr();
            }
            return it->second;
        }
        wsserver_t::connection_ptr get_conn_from_room(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            auto it = _room_user.find(uid);
            if (it == _room_user.end()) {
                return wsserver_t::connection_ptr();
            }
            return it->second;
        }
};

#endif
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值