从零开始手写mmo游戏从框架到爆炸(十六)— 客户端指定回调路由与登录

         导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客     

         我们这次来把注册、登录、选择英雄,进入主页-选择地图的功能完善。

         在这之前,我们还要解决一个问题,就是服务端往客户端发消息的路由问题,这个路由其实应该由客户端来指定,因为客户端在不同的场景中可能会调用同一个服务端路由,比如查询英雄状态,装备状态等等。所以应该由客户端来指定回调地址比较友好。由于这个字段并不是必须的,我们可以把回调的topic和tag放到一个基类中。

RequestBase.java

package com.loveprogrammer.dto.base;import java.io.Serializable;/*** @ClassName RequestBase* @Description 请求基类* @Author admin* @Date 2024/2/19 10:35* @Version 1.0*/
public class RequestBase implements Serializable {private int callbackTopic;private int callbackTag;public int getCallbackTopic() {return callbackTopic;}public void setCallbackTopic(int callbackTopic) {this.callbackTopic = callbackTopic;}public int getCallbackTag() {return callbackTag;}public void setCallbackTag(int callbackTag) {this.callbackTag = callbackTag;}
}

  补充登录相关的请求体以及执行handler

@Data
public class UserLogin extends RequestBase {private String userName;private String password;}

服务端的LoginHandler 中增加登录代码:

 /**** 登录* @param ctx* @param register*/@TagListener(tag = LogAndRegisterTag.TAG_LOGIN_LOGIN,messageClass = UserLogin.class)public void register(ChannelHandlerContext ctx, UserLogin register){//  查询用户User user = userService.findUserByAccount(register.getUserName());if(user == null) {// TODO 返回登录页面}// 对比密码if(!register.getPassword().equalsIgnoreCase(user.getPassword())) {// TODO 返回登录页面}// 登录成功,把user信息放入session中Session session = SessionManager.getInstance().getSessionByChannel(ctx.channel());session.setUserId(user.getId().toString());session.setNickname(user.getNickName());// 进入主页String result = "登录成功";StringMessage message = StringMessage.create(ClientTopic.TOPIC_MENU, ClientMenuTag.TAG_MENU_PORTAL);message.setStatusCode(CommonValue.MSG_STATUS_CODE_SUCCESS);message.setBody(result);SessionManager.getInstance().sendMessage(ctx.channel(),message);// TODO 客户端进入选择英雄页面}

客户端增加登录的处理:LoginHandler

package com.loveprogrammer.handler.support;import com.alibaba.fastjson2.JSON;
import com.loveprogrammer.command.BaseHandler;
import com.loveprogrammer.command.anotation.TagListener;
import com.loveprogrammer.command.anotation.TopicListener;
import com.loveprogrammer.command.client.ClientLoginTag;
import com.loveprogrammer.command.client.ClientMenuTag;
import com.loveprogrammer.command.client.ClientTopic;
import com.loveprogrammer.command.server.LogAndRegisterTag;
import com.loveprogrammer.command.server.ServerTopic;
import com.loveprogrammer.console.ConsolePrint;
import com.loveprogrammer.constants.CommonValue;
import com.loveprogrammer.dto.login.UserLogin;
import com.loveprogrammer.dto.login.UserRegister;
import com.loveprogrammer.network.NetworkClientListener;
import com.loveprogrammer.pojo.StringMessage;
import com.loveprogrammer.utils.ChannelUtils;
import com.loveprogrammer.utils.ScannerInput;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.Scanner;/*** @ClassName MenuHandler* @Description TODO* @Author admin* @Date 2024/2/18 17:37* @Version 1.0*/
@TopicListener(topic = ClientTopic.TOPIC_LOGIN)
public class LoginHandler extends BaseHandler {public static final Logger log = LoggerFactory.getLogger(LoginHandler.class);@TagListener(tag = ClientLoginTag.TAG_LOGIN_REGISTER,messageClass = String.class)public void LoginMenu(ChannelHandlerContext ctx, String msg){// 展示首页数据ConsolePrint.publishMessage("【1.登录已有账户】  【2.注册新账户】  【3.退出】");ConsolePrint.publishMessage("请选择:");int choose = ScannerInput.inputInt(1, 3, 3);while (choose != 3) {switch (choose) {case 1:ConsolePrint.publishMessage("请输入账户名:");String name = ScannerInput.inputString();ConsolePrint.publishMessage("请输入密码:");String password = ScannerInput.inputString();UserLogin userLogin = new UserLogin(name,password);StringMessage message = new StringMessage();message.setTopicId(ServerTopic.TOPIC_LOGIN);message.setTagId(LogAndRegisterTag.TAG_LOGIN_LOGIN);message.setStatusCode(CommonValue.MSG_STATUS_CODE_SUCCESS);message.setBody(JSON.toJSONString(userLogin));ChannelUtils.pushToServer(ctx.channel(), message);case 2:// 注册ConsolePrint.publishMessage("请输入注册的用户名");String registerName = ScannerInput.inputString();UserRegister register = new UserRegister();register.setName(registerName);StringMessage data = StringMessage.create(ServerTopic.TOPIC_LOGIN, LogAndRegisterTag.TAG_LOGIN_REGISTER);data.setStatusCode(CommonValue.MSG_STATUS_CODE_SUCCESS);data.setBody(JSON.toJSONString(register));ChannelUtils.pushToServer(ctx.channel(), data);default:ConsolePrint.publishMessage("暂未开放,敬请期待", 1);break;}}// 这里不退出,而是返回首页,做一个重定向NetworkClientListener.getInstance().forward(ctx,ClientTopic.TOPIC_LOGIN, ClientLoginTag.TAG_LOGIN_REGISTER,msg);}
}

客户端的效果如下:

14:28:18.060 [nioEventLoopGroup-2-1] [INFO ] com.loveprogrammer.handler.HandlerFactory:32 --- 初始化消息监听器成功 com.loveprogrammer.handler.support.MenuHandler
14:28:18.060 [nioEventLoopGroup-2-1] [INFO ] com.loveprogrammer.handler.HandlerFactory:32 --- 初始化消息监听器成功 com.loveprogrammer.handler.support.LoginHandler
【1.登录已有账户】  【2.注册新账户】  【3.退出】
请选择:
1
请输入账户名:
eric
请输入密码:
111111
请输入注册的用户名
14:28:29.832 [nioEventLoopGroup-2-1] [INFO ] com.loveprogrammer.network.NetworkClientListener:32 --- 数据内容:data=StringMessage{messageId=2, statusCode=1, length=12, body='登录成功'}
登录成功
请选择您要进行的操作
【1.打怪】  【2.装备】  【3.战兽】
【4.冒险者工会】   【5.副本】  【6.工会】 
【8.配置】  【9.退出】
请选择:

全部源码详见:

gitee : eternity-online: 多人在线mmo游戏 - Gitee.com

分支:step-09

请各位帅哥靓女帮忙去gitee上点个星星,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/260687.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】H3C 路由器多系列信息泄露漏洞

Nx01 产品简介 H3C路由器是一款高性能的路由器产品,具有稳定的性能和丰富的功能。它采用了先进的路由技术和安全机制,可以满足不同用户的需求,广泛应用于企业、运营商和数据中心等领域。 Nx02 漏洞描述 H3C路由器多系列存在信息泄露漏洞&…

网络爬虫基础(上)

1. 爬虫的基本原理 爬虫就是在网页上爬行的蜘蛛,每爬到一个节点就能够访问该网页的信息,所以又称为网络蜘蛛; 网络爬虫就是自动化从网页上获取信息、提取信息和保存信息的过程; 2. URL的组成部分 URL全称为Uniform Resource L…

Oracle 如何提高空间使用率?

一,行迁移和行链接。 oracle尽量保证一行的数据能够放在同一个数据块当中,有的时候行会发生行迁移和行链接。 行链接 :有一个列的字段是大对象(long,longlong)一行占的数据一整个块都放不下,则…

07 Redis之持久化(RDB+AOF)

4 Redis持久化 Redis 是一个内存数据库,然而内存中的数据是不持久的,若主机宕机或 Redis 关机重启,则内存中的数据全部丢失。 当然,这是不允许的。Redis 具有持久化功能,其会按照设置以快照或操作日志的形式将数据持…

Leetcode刷题笔记题解(C++):83. 删除排序链表中的重复元素

思路:链表相关的问题建议就是画图去解决,虽然理解起来很容易,但就是写代码写不出来有时候,依次去遍历第二节点如果与前一个节点相等则跳过,不相等则遍历第三个节点 /*** Definition for singly-linked list.* struct …

uniapp不同平台获取文件内容以及base64编码特征

前言 文件图片上传,客户端预览是很正常的需求,获取文件的md5特征码也是很正常的,那么,在uniapp中三种环境,h5, 小程序以及 app环境下,如何实现的? 参考: 如何在uniapp中读取文件Arr…

Https证书续签-acme.sh-腾讯云之DnsPod

ename 域名切换到 DnsPod 上面解析 可以先看下之前的 acme.sh 介绍文章然后再来次补充更多。 之前说过了 acme.sh 在阿里云下的使用。 这里做个后续补充 之前的域名是在 ename 上的 ,为了自动续签切换到 DnsPod 上面解析 注意事项 可以把原来 ename 上的解析先导出…

多端开发围炉夜话

文章目录 一、多端开发 一、多端开发 uni-app 官网 UNI-APP中的UI框架:介绍常用的UI框架及其特点 uView UIVant WeappColor UIMint UI

python 与 neo4j 交互(py2neo 使用)

参考自:neo4j的python.py2neo操作入门 官方文档:The Py2neo Handbook — py2neo 2021.1 安装:pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 1 节点 / 关系 / 属性 / 路径 节点(Node)和关系(relationship)是构成图的基础…

Android 7.0以上charles无法抓取部分https包问题

首先保证配置一切正确 手机通过访问chls.pro/ssl下载.pem证书,如无法安装,在文件管理器中将后缀名改为.crt 在设置中安装该证书 Charles-Proxy - SSL Proxying Setting - Include 添加需要抓包的URL:443即可 以上基本配置结束后,看下代码 代…

Java+SpringBoot:滑雪场管理的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

Linux挂载磁盘和磁盘分区及设置开机自动挂载_亲测成功

Linux挂载磁盘和磁盘分区及设置开机自动挂载_亲测成功 Linux下磁盘分区命令主要由两个: fdisk :最大支持不超过2T,MBR分区;parted :支持GPT,适用于大容量分区; 如果挂载磁盘超过2T,请使用GPT分区,不然会…

探索水下低光照图像检测性能,基于DETR(DEtection TRansformer)模型开发构建海底生物检测识别分析系统

海底这类特殊数据场景下的检测模型开发相对来说比较少,在前面的博文中也有一些涉及,感兴趣的话可以自行移步阅读即可: 《尝试探索水下目标检测,基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBA…

搜维尔科技:OptiTrack探索人类与技术之间关系的开创性表演

另一种蓝色通过 OptiTrack 释放创造力 总部位于荷兰的当代舞蹈团因其探索人类与技术之间关系的开创性表演而受到广泛赞誉。该公司由富有远见的编舞家大卫米登多普创立,不仅利用技术作为探索的主题,而且将其作为表达故事的动态工具。 “我一直对文化与…

超平面介绍

超平面公式 (1) 超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中,一条直线是一维的,它把平面分成了两部分;三维空间中,一个平面是二维的,它把空间分成了两部分。(2…

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOAHA 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff…

iOS整理 - 关于直播 - 搭建服务端

前言 其实本人一直都想自己简单做一套直播(包括移动端和服务端)的开发测试,但是之前一直做得比较迷茫。最近偶然间在来了灵感,瞬间解除了我很多疑惑。我会分享出来,希望大家一起研究下。稍后,我完整做好了…

python在flask中的请求数据“无限流”

文章目录 一、问题描述二、解决方案 一、问题描述 在flask请求中,有个需求是让调用方一直调接口,并立马返回,而接口方缓存请求,依次执行。 二、解决方案 from flask import Flask, request, jsonify from queue import Queue i…

使用C# Net6连接国产达梦数据库记录

达梦官网:http://www.dameng.com/ 1 下载达梦并进行安装 下载地址:官网首页——服务与合作——下载中心(https://www.dameng.com/list_103.html) 根据需要自行下载需要的版本,测试版本为:x86 win64 DM8版…

【C#】List泛型数据集如何循环移动,最后一位移动到第一位,以此类推

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…