【从零开始学Skynet】实战篇《球球大作战》(八):login代码设计

news2024/9/19 10:42:57

         现在来编写我们的第二个服务——登录服务,在编写此服务时,建议大家对照着如下所示的流程图来看,知晓各个方法的作用,写起来会简单许多。

 

1、登录协议

定义如下图所示的登录协议:

         客户端需要发送玩家账号和密码,服务端收到登录协议后,会做出回应,中间参数0代表登录成功,若为1则代表登录失败,第二个参数代表(失败的)原因,比如“账号或密码错误”“其他玩家正在尝试登录该账号,请稍后再试”。

2、客户端消息分发

        gateway会将客户端协议以client消息的形式转发给login服务。由于客户端会发送很多协议,虽然可以在login服务的s.resp.client方法中编写多个if来判断,但消息一多,s.resp.client可能会变得混乱,因此最好是再做一次消息分发,根据不同的协议名指定不同的处理方法。

    下面编写如下所示代码的client远程调用,它实现两个功能。

  • 根据协议名(cmd)找到s.client.XXX方法,并调用它。
  • 鉴于服务端几乎都要给客户端回应消息,因此给出一个简便处理方式。将s.client.XXX的返回值发回给客户端(经由gateway转发)。
local skynet = require "skynet"
local s = require "service"

s.client = {}
s.resp.client = function(source, fd, cmd, msg)
    if s.client[cmd] then
        local ret_msg = s.client[cmd]( fd, msg, source)
        skynet.send(source, "lua", "send_by_fd", fd, ret_msg)
    else
        skynet.error("s.resp.client fail", cmd)
    end
end

s.start(...)

变量的含义如下:

  • s.client:定义一个空表,用于存放客户端消息处理方法。
  • 参数source:消息发送方,比如某个gateway。
  • 参数fd:客户端连接的标识,由gateway发送过来。
  • 参数cmd和msg:协议名和协议对象。

 

 3、登录流程处理

        登录服务会先校验客户端发来的用户名密码,再作为gatewayagentmgr的中介,等待agentmgr创建代理服务。代码如下所示:

s.client.login = function(fd, msg, source)
	local playerid = tonumber(msg[2])
	local pw = tonumber(msg[3])
	local gate = source
	node = skynet.getenv("node")
    --校验用户名密码
	if pw ~= 123 then
		return {"login", 1, "密码错误"}
	end
	--发给agentmgr
	local isok, agent = skynet.call("agentmgr", "lua", "reqlogin", playerid, node, gate)
	if not isok then
		return {"login", 1, "请求mgr失败"}
	end
	--回应gate
	local isok = skynet.call(gate, "lua", "sure_agent", fd, playerid, agent)
	if not isok then
		return {"login", 1, "gate注册失败"}
	end
    skynet.error("login succ "..playerid)
    return {"login", 0, "登陆成功"}
end

       1)校验用户名密码:为减少代码量,这里只是简单判断密码是否为“123”,读者可以根据自己的需要,在此处查询数据库或者平台SDK。

  • playerid:玩家id;
  • pw:密码;
  • gate:转发消息的gateway服务;
  • node:本节点名称。

        2)请求登录:agentmgr发送reqlogin请求登录。reqlogin会回应两个值,第一个值isok代表是否成功,agent代表已创建的代理服务id。对应流程图中的阶段③。

        3)给gate发送sure_agent,对应流程图中的阶段⑧。

        4)如果全部过程成功执行,login服务会打印“login succ”,并给客户端回应成功信息(根据消息分发过程,login服务会把s.client.XX的返回值发回给客户端)。

完整代码地址:https://gitee.com/frank-yangyu/ball-server

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis 源码解析 面试题总结

MyBatis源码学习环境下载 文章目录1、工作原理1.1 初始化1.1.1 系统启动的时候,加载解析全局配置文件和相应的映射文件1.1.2 建造者模式帮助我们解决复杂对象的创建:1.2 处理SQL请求的流程1.2.1 通过sqlSession中提供的API方法来操作数据库1.2.2 获取接口…

UOS内核替换kylin内核

一、替换UOS内核 如果可以获取UOS的的ROOT权限, 跳过步骤一和二。 步骤一、配置环境 如果有UOS系统的机器,则不需要安装,跳到步骤二 。 如果没有UOS系统则需要下载, 下载UOS镜像:统信UOS生态社区 - 打造操作系统创新生态 ,下载专业版需要用户注册大概1~3天可以通过,…

HTML-form表单和提交

网络请求 在浏览器的URL中写入地址,点击回车访问时 浏览器会发送数据过去,本质上发送的是字符串 浏览器向后端发送请求时 GET请求【URL方法/表单提交】 现象:向后台传入数据,数据会拼接在URL上 搜索百度时: http…

十四、Pytorch实现RNN Classifier

一、项目需求 数据集:姓名和对应的国籍 要求:输入一个姓名,通过模型可以得到TA所属的国籍 数据集下载:name_country_datasets 二、思路步骤分析 ①准备数据集 将下载好的数据集解压,放到一个指定的位置&#xff0c…

文心一格小程序,AI绘画产品

文章目录AIGC什么是AI作画?Prompt文心一格文心一格小程序使用方法使用小程序进行AI绘图AIGC的未来发展结语AIGC AIGC(AI Generated Content)是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容,GC的意思是创作内容。与…

samba介绍和使用

一. 介绍 Samba是一套使用SMB(Server Message Block)协议的应用程序, 通过支持这个协议, Samba允许Linux服务器与Windows系统之间进行通信,使跨平台的互访成为可能。 Samba采用C/S模式, 其工作机制是让NetBIOS( Windows 网上邻居的通信协议)和SMB两个协议运行于TCP/IP通…

【Obsidian】基础使用手册(包括如何将Obsidian页面设置为中文)

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于工具类软件的笔记 🈶本篇是Obsidian的基础使用 Obsidian的基础使用将页面设置为中文常用的默认快捷键常用的格式标题代码块表格字体样式列表任务列表官方下载地址&am…

中国电子学会2022年12月份青少年软件编程Python等级考试试卷六级真题(含答案)

一、单选题(共25题,共50分) 1.数据文件“abc.txt”中包含若干个英文单词,如图所示: 读取文件“abc.txt”中数据的Python程序段如下: file abc.txt word_b [] for word in open(file):if word[0:1] a and len(word)>4:wor…

ASP学生公寓管理系统的设计与实现

学生公寓是每一位在校学生生活、学习、相互交流的主要场所,如何提供一个良好的学生公寓的管理体系,对学校和同学而言至关重要。以往的学生公寓管理基本上还处于人工操作的阶段,随着计算机技术和网络技术的日益广泛应用,采用计算机…

Oracle基础部分三(视图、物化视图、序列、同义词、索引)

Oracle基础部分三(视图、物化视图、序列、索引)1 视图1.1概述1.2 创建普通视图1.2.1 创建普通视图1.2.2 创建带检查约束的视图1.2.3 创建只读视图的创建与使用1.2.4 强制创建视图1.2.5 创建复杂视图1.2.5.1 多表关联1.2.5.2 分组聚合统计的复杂视图1.3 创建物化视图…

强化学习简介

1.强化学习简介 **强化学习(Reinforcement Learning,RL)**是机器学习中的一个领域,是学习“做什么(即如何把当前的情景映射成动作)才能使得数值化的收益信号最大化”。学习者不会被告知应该采取什么动作&a…

CDN(内容分发网络)技术原理

1. 前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加, 用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速…

认证 (authentication) 和授权 (authorization) 的区别

以前一直傻傻分不清各种网际应用中 authentication 和 authorization, 其实很简单: 这两个术语通常在安全性方面相互结合使用,尤其是在获得对系统的访问权限时。两者都是非常重要的主题,通常与网络相关联,作为其服务基础架构的关键部分。然而…

vite+vue3+pinia+vuex4动态路由解决刷新页面丢失

目录 了解如何添加动态路由 使用pinia持久化数据 解决方案 404找不页面问题 目前解决思路 完整路由配置 动态路由使用的数据 了解如何添加动态路由 vue官网-动态添加路由 使用pinia持久化数据 pinia的使用 解决方案 asyncRoutes()方法从pinia获取到动态菜单数据登陆成…

SpringMVC 01 -SpringMVC入门

高效学习习惯啊 坚持,比如这样经常更新博客,保持学习哈哈哈 SpringMVC-SpringMVC引入1 SpringMVC引入1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处1.2.3 执行流程【重点】2 快速入门2.1 导入依赖2.2 配置核心(前端)控制器2.3 springmvc核心配置文件2.4 创建…

开心档之C++ 修饰符类型

C 修饰符类型 目录 C 修饰符类型 实例 C 中的类型限定符 C 允许在 char、int 和 double 数据类型前放置修饰符。修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求。 下面列出了数据类型修饰符: signedunsignedlongshort 修饰符 signed、…

Gitlab中Pipeline语法六

Gitlab中Pipeline语法 needs/include/extends nodes 阶段并行 - 可以无序执行作业,无序按照阶段顺序运行某些作业,可以让多个阶段同时运行. - 如果nedds:设置为指向因only/except规则而未实例化的作业,或者不存在,则创建管道时会出现yaml错误. stages:- build- test- depl…

Moviepy模块之视频添加字幕(二)

文章目录前言一、素材1.1 原视频1.2 字幕文件二、视频添加字幕2.1 引入库2.2 加载视频文件2.3 设置字幕的字体、大小、颜色2.4 加载字幕文件2.5 设置字幕位置2.6 将字幕添加到视频中2.7 保存带有字幕的视频文件三、新视频效果总结前言 大家好,我是空空star&#xff…

2023蓝桥杯C++A组题解(第十四届)

面向爆零选手 水平有限,将就着看,有空再补充后5题 目录 🤯吐槽 😟A,2067: [蓝桥杯2023初赛] 幸运数 😟B,2068: [蓝桥杯2023初赛] 有奖问答 🌼AC DFS 🌼AC DP &a…

Apache 配置与应用

目录构建虚拟 Web 主机基于域名的虚拟主机1.为虚拟主机提供域名解析2.为虚拟主机准备网页文档3.添加虚拟主机配置4.设置访问控制5.加载独立的配置文件6.在客户机中访问虚拟 Web 主机基于IP地址的虚拟主机基于端口的虚拟主机Apache 连接保持构建Web虚拟目录与用户授权…