C++项目:在线五子棋对战网页版---在线用户管理模块开发

在线用户管理模块 

在线用户管理就是对当前处于游戏大厅或者游戏房间中的用户进行管理,主要是建⽴起用户与Socket连接的映射关系,这个模块具有两个功能:

1. 能够让程序中根据用户信息,进⽽找到能够与用户客⼾端进⾏通信的Socket连接,进⽽实现与客⼾端的通信。

2. 判断⼀个用户是否在线,或者判断用户是否已经掉线。

也就是说,在这个模块中,通过将用户信息,比如用户id,将该用户id与他的客户端的通信连接绑定起来,然后可以在程序中,根据这个用户id,找到对应的客户端的通信连接,实现服务器与客户端的通信。

因此,我选择了使用unordered_map作为容器,将用户信息与连接形成映射关系。

在在线用户管理的类中,需要提供以下方法:

1.将已经成功创建websocket长连接的用户,与他的通信连接(游戏房间或游戏大厅)建立映射关系。

2.将断开长连接的用户,移除。

3.判断用户是否在线(游戏大厅或游戏房间中)

4.通过用户id,获取对应的游戏大厅/游戏房间的通信连接。

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

class online_manager
{
private:
    //用于建立游戏大厅中用户id与通信连接的关系
    std::unordered_map<uint64_t,wsserver_t::connection_ptr> _hall_user;
    //用于建立游戏房间中用户id与通信连接的关系
    std::unordered_map<uint64_t,wsserver_t::connection_ptr> _room_user;
    std::mutex _mutex;
public:
    /*当websocket长连接成功建立后,调用这个函数,将用户的uid与其连接加入到游戏大厅中*/
    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));
    }

    /*当websocket长连接成功建立后,调用这个函数,将用户的uid与其连接加入到游戏大厅中*/
    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);
        /*当uid被移除,对应的conn也就没有了相映射的关系,就会计数器--变成0,就会自动销毁*/
        _hall_user.erase(uid); 
    }
    /*当websocket长连接断开后,需要调用这个函数,将用户和它的连接从游戏房间中移除*/
    void exit_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        /*当uid被移除,对应的conn也就没有了相映射的关系,就会计数器--变成0,就会自动销毁*/
        _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;
    }

    /*通过用户id,获取对应的游戏房间的通信连接*/
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山雾隐藏的黄昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值