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

相关文章

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat