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

本文主要是介绍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.5.C++项目:网络版五子棋对战之数据管理模块-在线用户管理模块的设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/270635

相关文章

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::