当前位置: 首页 > news >正文

【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.

一、web服

1)账号注册 // 用于唯一命名服务

com.xinyue.game.center.business.account.logic.AccountRegisterService#accountRegister

 public void accountRegister(AccountEntity account) {accountManager.checkUsername(account.getUsername());accountManager.checkPassword(account.getPassword());checkUsernameHaveRegister(account.getUsername());// 注册的用户名,立马用redis保存下boolean saveResult = accountRedisManager.saveUsername(account.getUsername());if (saveResult) {AccountEntity saveAccount = accountDao.save(account);account.setId(saveAccount.getId());logger.info("用户注册成功,username:{}", account.getUsername());} else {throw ServerErrorCode.ACCOUNT_1005.exception();}}

唯一性实现

 public boolean saveUsername(String username) {String value = String.valueOf(System.currentTimeMillis());return redisTemplate.opsForValue().setIfAbsent(username, value, Duration.ofHours(USERNAME_EXPIRE_HOURS));}

经过注册后,进行登录

2)角色注册 / redis自增

com.xinyue.game.center.business.role.RoleService#createRole

    public CreateRoleResponse createRole(CreateRoleRequest createRoleParam) throws Exception {AccountEntity accountEntity = accountService.getAndCheckAccount(createRoleParam.getUserId());createRoleManager.checkNicknameSensitive(createRoleParam.getNickname());createRoleManager.checkRoleExist(accountEntity, createRoleParam.getZoneId());// 创建角色,这一步是会使用redis的自增PlayerEntity roleEntity = createRoleManager.createRole(createRoleParam);ZoneRoleEntity zoneRoleEntity = createRoleManager.getZoneRole(roleEntity);accountEntity.getSectionPlayerMap().put(createRoleParam.getZoneId(), zoneRoleEntity);accountService.updateAccount(accountEntity);CreateRoleResponse createRoleResponse = new CreateRoleResponse();createRoleResponse.setPlayerId(zoneRoleEntity.getPlayerId());createRoleResponse.setNickname(roleEntity.getNickname());createRoleResponse.setCreateTime(roleEntity.getCreateTime());createRoleResponse.setLastLoginTime(roleEntity.getCreateTime());String token = this.createToken(roleEntity);createRoleResponse.setToken(token);return createRoleResponse;}

自增实现

  public String generateRoleId(String zoneId) {String key = getKey(zoneId);long roleId = redisTemplate.opsForValue().increment(key);return zoneId + "_" + roleId;}

二、游戏服

1.请求进入游戏 // 携带userId 和 playerId和token

com.xinyue.game.server.logic.player.PlayerHandler#enterGame

   @GameMapping(EnterGameRequest.class)public void enterGame(GameChannelContext ctx, EnterGameRequest request) {String userId = request.getUserId();userService.checkUserId(userId);userService.checkToken(userId, request.getToken());logger.debug("用户认证成功,userId: {},token:{}", userId, request.getToken());this.bindChannel(ctx.getNettyCtx(), request.getPlayerId());gameAsyncTaskService.execute(request.getPlayerId(), "获取玩家信息", () -> {PlayerEntity playerEntity = playerCacheService.getPlayerOrLoading(request.getPlayerId());if (playerEntity == null) {ctx.writeAndFlush(EnumGameError.ROLE_NOT_EXIST);} else {EnterGameResponse response = new EnterGameResponse();response.setRole(playerEntity);ctx.writeAndFlush(response);}});}

可见,核心是GameChannelContext!!!

这个上下文是如何构建的呢?

com.xinyue.server.framework.handler.GameRequestDispatcherHandler#channelRead

    @Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {if (msg instanceof GameMessagePackage) {try {GameMessagePackage request = (GameMessagePackage) msg;IGameMessage gameMessage = request.getBody();GameMessageHeader header = request.getHeader();// 重点就是这一步了GameChannelContext gtx = new GameChannelContext(ctx, header);IGameMessage requestMessage = gameMessage;int messageId = header.getLogicMessageId();int messageType = GameMessageType.REQUEST.getType();MessageClassKey classKey = new MessageClassKey(messageId, messageType);GameHandlerMappingManager gameHandlerMappingManager = GameHandlerMappingManager.getInstance();// 进行反射调用。 这一步的消息其实可以包装到上下文中。gameHandlerMappingManager.callMethod(gtx, classKey, requestMessage);} catch (Throwable e) {logger.error("处理客户端请求异常", e);}} else {logger.warn("收到非游戏对象请求数据:{}", msg.getClass().getName());ctx.fireChannelRead(msg);}}

相关文章:

【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.

一、web服 1)账号注册 // 用于唯一命名服务 com.xinyue.game.center.business.account.logic.AccountRegisterService#accountRegister public void accountRegister(AccountEntity account) {accountManager.checkUsername(account.getUsername());accountManager.checkPass…...

neo4j 图表数据导入到 TuGraph

neo4j 图表数据导入到 TuGraph 代码文件说明后文 前言:近期在引入阿里的 TuGraph 图数据库,需要将 原 neo4j 数据导入到新的 tugraph 数据库中。预期走csv文件导入导出,但因为格式和数据库设计问题,操作起来比较麻烦(可能是个人没…...

启动报错java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus

报错信息图片 日志: Exception in thread "Quartz Scheduler [scheduler]" java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus先说我自己遇到的问题,我们项目在web设置了自定义的log输出路径,多了一个 / 去…...

【ubuntu18.04】ubuntu18.04挂在硬盘出现 Wrong diagnostic page; asked for 1 got 8解决方案

错误日志 [ 8754.700227] usb 2-3: new full-speed USB device number 3 using xhci_hcd [ 8754.867389] usb 2-3: New USB device found, idVendor0e0f, idProduct0002, bcdDevice 1.00 [ 8754.867421] usb 2-3: New USB device strings: Mfr1, Product2, SerialNumber0 [ 87…...

kubeadm安装K8s高可用集群之集群初始化及master/node节点加入calico网络插件安装

系列文章目录 1.kubeadm安装K8s高可用集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 3.kubeadm安装K8s高可用集群之集群初始化及master/node节点加入集群calico网络插件安装 kubeadm安装K8s高可用集群之集群初始化及master/node节点加入ca…...

游戏何如防抓包

游戏抓包是指在游戏中,通过抓包工具捕获和分析游戏客户端与服务器之间传输的封包数据的过程。抓包工具可实现拦截、篡改、重发、丢弃游戏的上下行数据包,市面上常见的抓包工具有WPE、Fiddler和Charles Proxy等。 抓包工具有两种实现方式,一类…...

【LeetCode】每日一题 2024_12_19 找到稳定山的下标(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ 最近力扣的每日一题出的比较烂,难度过山车,导致近期的更新都三天打鱼,两天断更了 . . . LeetCode 启动! 题目:找到稳定山的下标 代码与解题思路 先读题:最重要…...

运维 mysql、redis 、RocketMQ性能排查

MySQL查看数据库连接数 1. SHOW STATUS命令-查询当前的连接数 MySQL 提供了一个 SHOW STATUS 命令,可以用来查看服务器的状态信息,包括当前的连接数。 SHOW STATUS LIKE Threads_connected;这个命令会返回当前连接到服务器的线程数,即当前…...

[SAP ABAP] 将内表数据转换为HTML格式

从sflight数据库表中检索航班信息,并将这些信息转换成HTML格式,然后下载或显示在前端 开发步骤 ① 自定义一个数据类型 ty_sflight 来存储航班信息 ② 声明内表和工作区变量,用于存储表头、字段、HTML内容和航班详细信息以及创建字段目录lt…...

LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库

背景 Dify 是一款开源的大语言模型(LLM) 应用开发平台。其直观的界面结合了 AI 工作流、 RAG 管道、 Agent 、模型管理、可观测性功能等,让您可以快速从原型到生产。相比 LangChain 这类有着锤子、钉子的工具箱开发库, Dify 提供了更接近生产需要的完整…...

使用C语言连接MySQL

在C语言中连接MySQL数据库,通常需要使用MySQL提供的C API。以下是使用C语言连接MySQL数据库的基本步骤和示例代码: 步骤 1: 安装MySQL C API 首先,确保你的系统上安装了MySQL数据库,并且安装了MySQL C API库。在大多数Linux发行版…...

PyTorch 2.0 以下版本中设置默认使用 GPU 的方法

PyTorch 2.0 以下版本中设置默认使用 GPU 的方法 在 PyTorch 2.0以下版本中,默认情况下仍然是使用 CPU 进行计算,除非明确指定使用 GPU。在 PyTorch 2.0 以下版本中,虽然没有 torch.set_default_device 的便捷方法,但可以通过显式…...

信号槽【QT】

文章目录 对象树字符集信号槽QT坐标系信号与槽connect自定义槽自定义信号disconnect 对象树 #ifndef MYLABEL_H #define MYLABEL_H#include<QLabel> class MyLabel : public QLabel { public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWi…...

【UE5 C++课程系列笔记】10——动态单播/多播的基本使用

目录 概念 申明动态委托 一、DECLARE_DYNAMIC_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 绑定动态委托 一、BindDynamic 二、AddDynamic 三、RemoveDynamic 执行动态委托 ​一、Execute 二、ExecuteIfBound 三、IsBound 四、Broadcast 动态单播使用示…...

点击展示大图预览

原文链接在table表格里能够实现&#xff0c;点击里面的图片实现大图预览的效果&#xff1b; 一、先安装viewer — 使用npm安装 npm install v-viewer --save二、在main.js中引入 import Viewer from v-viewer //点击图片大图预览 import viewerjs/dist/viewer.css Vue.use(…...

【C++】分书问题:深入解析、回溯法高级应用与理论拓展

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;思路与算法回溯法理论基础 &#x1f4af;代码实现与解析完整代码代码关键步骤解析 &#x1f4af;时间复杂度与空间复杂度分析&#x1f4af;理论拓展&…...

java开发入门学习五-流程控制

流程控制语句 if&#xff0c; if...else&#xff0c; if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式&#xff0c;使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…...

【FFmpeg 教程 一】截图

本章使用 ffmpeg 实现观影中经常会用到的功能&#xff0c;截图。 以下给出两种方式。 课程需具备的基础能力&#xff1a;Python 1. 使用 subprocess 调用 FFmpeg 命令 import subprocess def extract_frame(video_path, output_image_path, timestamp"00:00:05")&qu…...

北邮,成电计算机考研怎么选?

#总结结论&#xff1a; 基于当前提供的24考研复录数据&#xff0c;从报考性价比角度&#xff0c;建议25考研的同学优先选择北邮计算机学硕。主要原因是:相比成电&#xff0c;北邮计算机学硕的目标分数更低&#xff0c;录取率更高&#xff0c;而且北邮的地理位置优势明显。对于…...

深入了解京东API接口:如何高效获取商品详情与SKU信息

在当今数字化时代&#xff0c;电商平台的数据接口成为了连接商家与消费者的桥梁。京东作为国内领先的电商平台&#xff0c;其API接口为开发者提供了丰富的商品信息获取途径。本文将深入探讨如何使用京东API接口高效获取商品详情与SKU信息&#xff0c;并附上简短而实用的代码示例…...

从分辨率、码率到蓝光:解码高清视频的三大核心要素

1. 分辨率&#xff1a;高清世界的基石 第一次接触高清视频时&#xff0c;我被商家宣传的"4K超清"搞得一头雾水。直到自己开始做视频剪辑才明白&#xff0c;分辨率就像织布的经纬线——它决定了画面能有多细腻。举个生活中的例子&#xff0c;1080P分辨率相当于用19201…...

监听bean在容器中注入情况

直接上代码&#xff0c;原理就是 通过环境监听器/*** 调试监听器* author shadow*/ public class DebugListener {Autowiredprivate ApplicationContext applicationContext;EventListener(ApplicationReadyEvent.class)public void onApplicationReady() {System.out.println(…...

Cursor3.3发布:Skill 自动转为快捷操作

想象一下&#xff1a;每次发版之前&#xff0c;你盯着一个庞大PR&#xff0c;脑子里同时跑着十几个线程——这个模块要重构、那个API要优化、还有安全扫描不能忘。以前你得像个孤独的指挥家&#xff0c;一根根指挥棒轮流挥。 现在&#xff0c;Cursor直接给你拉来一支AI交响乐团…...

RePKG终极指南:如何深度解析Wallpaper Engine资源包与TEX纹理转换

RePKG终极指南&#xff1a;如何深度解析Wallpaper Engine资源包与TEX纹理转换 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine设计的专业级资源包解…...

039对称二叉树

对称二叉树 题目链接&#xff1a;https://leetcode.cn/problems/symmetric-tree/description/?envTypestudy-plan-v2&envIdtop-100-liked 我的解答&#xff1a; //方法一&#xff1a;递归 //时间复杂度&#xff1a;O(n) //空间复杂度&#xff1a;O(n) public boolean isSy…...

性能巨兽:基于AMD EPYC 9755与RTX 5090D的UltraLAB GA660M仿真工作站深度解析

在高端制造、能源勘探和前沿科学计算领域&#xff0c;算力永远是稀缺资源。每一次CPU与GPU的代际更迭&#xff0c;都意味着仿真效率的指数级提升。今天&#xff0c;我们解析的这款UltraLAB GA660M241256-MBD工作站&#xff0c;正是集成了2026年顶级硬件技术的算力平台。它不仅是…...

Exynos 5410处理器:big.LITTLE架构与28nm工艺的移动计算革命

1. Exynos 5410处理器&#xff1a;移动计算的新标杆2013年&#xff0c;当智能手机和平板电脑的性能需求开始爆发式增长时&#xff0c;三星推出了Exynos 5410处理器&#xff0c;这款SoC在当时堪称移动计算领域的一次革命。作为全球首款采用big.LITTLE架构的八核处理器&#xff0…...

使用git filter-repo删除已提交到git中的敏感信息,api key,配置文件等

使用git filter-repo删除已提交到git中的敏感信息&#xff0c;api key&#xff0c;配置文件等 前提条件 Python 3.5 git > 2.22.0通过 pip 安装&#xff1a;pip install git-filter-repo 注意事项 官方推荐在fresh clone上修改&#xff0c;即clone一份远程的再做修改 操作后…...

Cursor AI 代码助手规则引擎:定制化约束与团队协作实践

1. 项目概述&#xff1a;一个为 Cursor 编辑器量身定制的规则引擎如果你和我一样&#xff0c;深度依赖 Cursor 这款 AI 驱动的代码编辑器&#xff0c;那你一定遇到过这样的场景&#xff1a;面对一个复杂的重构任务&#xff0c;你向 Cursor 的 AI 助手&#xff08;无论是 Claude…...

如何3分钟精准定位Windows热键冲突:Hotkey Detective深度技术解析

如何3分钟精准定位Windows热键冲突&#xff1a;Hotkey Detective深度技术解析 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...