Leaf游戏框架--玩家登陆协议定义

首先 我们需要增加玩家注册、登陆的协议,消息结构定义在server\msg\msg.go中,但是为了便于查找建议单独建立文件 例如 如下图 建立目录:server\msg\protocolfile\protocol.go

protocol.go 内容

package Protocol
// 用户登陆协议
type UserLogin struct {LoginName string // 用户名LoginPW   string // 密码
}
// 注册协议
type UserRegister struct {LoginName string // 用户名LoginPW   string // 密码// Mobi      string // 手机号// Email      string // 邮箱
}
// 玩家的临时结构
// 玩家有角色的情况
type UserST struct {UID      string // 账号IDServerID string // 服务器IDRoleUID  string // 角色UIDRoleName string // 角色名字RoleLev  string // 角色等级Coin     string // 金币// 其他的暂时不做定义
}

登陆路由配置

路由配置方式请参照前几节文章,本节及后面只是概括
路径:server\gate\router.go

router.go :

package gate
import (_ "server/game""server/login""server/msg""server/msg/protocolfile"
)
func init() {msg.Processor.SetRouter(&Protocol.UserLogin{}, login.ChanRPC)
}

注册消息
路径:server\msg\msg.go
msg.go:

package msg
import ("server/msg/protocolfile""github.com/name5566/leaf/network""github.com/name5566/leaf/network/json"
)
var Processorbak network.Processor
// 使用默认的 JSON 消息处理器(默认还提供了 protobuf 消息处理器)
var Processor = json.NewProcessor()
func init() {// 这里我们注册了一个 JSON 消息 TestProcessor.Register(&Protocol.UserLogin{})
}

以上配置完成后,消息注册及路由配置就OK了,总结下 如下:
1 msg.go      消息注册使用

2 protocol.go 消息定义

leaf游戏服务器处理玩家登陆逻辑

文件位置:
server\login\internal\module.go
注:此节不链接MongoDB

module.go

package internal
import ("reflect""server/msg/protocolfile""github.com/name5566/leaf/gate""github.com/name5566/leaf/log"
)
func handleMsg(m interface{}, h interface{}) {skeleton.RegisterChanRPC(reflect.TypeOf(m), h)
}
func init() {// 向当前模块(login 模块)注册 Protocol.UserLogin 消息的消息处理函数 handleTesthandleMsg(&Protocol.UserLogin{}, handleTest)
}
// 消息处理
func handleTest(args []interface{}) {// 收到的 Test 消息m := args[0].(*Protocol.UserLogin)// 消息的发送者a := args[1].(gate.Agent)// 1 查询数据库--判断用户是不是合法// 2 如果数据库返回查询正确--保存到缓存或者内存// 输出收到的消息的内容log.Debug("Test login %v", m.LoginName)// 给发送者回应一个 Test 消息a.WriteMsg(&Protocol.UserLogin{LoginName: "client",})
}

H5客户端实现

index.html:

<head><meta charset="utf-8" /><title></title>
</head>
<body><h3 style="color: cornflowerblue;">Golang语言社区(www.Golang.Ltd)</h3> 发送数据: <input type='text' id='name' value="Leaf测试"><input type="submit" onclick="login()" />
</body>
<script>var wsUri = "ws://127.0.0.1:8889/?{'new':3}";var json;function login() {var Data = {LoginName: "Golang.Ltd",LoginPW: "123456",};var json = {UserLogin:Data}var goServerJson = JSON.stringify(json);wsUri = wsUri;console.log(wsUri);doSend(goServerJson);}var output;var websocket1;function init() {output = document.getElementById("output");testWebSocket();}function testWebSocket() {console.log(wsUri)websocket1 = new WebSocket(wsUri);websocket1.onopen = function(evt) {onOpen(evt)};websocket1.onclose = function(evt) {onClose(evt)};websocket1.onmessage = function(evt) {onMessage(evt)};websocket1.onerror = function(evt) {onError(evt)};}function onOpen(evt) {console.log("CONNECTED");}function onClose(evt) {console.log("DISCONNECTED");}function onMessage(evt) {var data = evt.data;console.log("data=" + data);}function onError(evt) {console.log(evt.data);}function doSend(message) {console.log(message);websocket1.send(message);}window.addEventListener("load", init, false);
</script>

页面截图:

简单说明下,H5的部分代码
1 链接端口为什么是8889 ?
原因是我们在leaf架构中配置的是8889
文件位置:
server\conf\server.json

server.json

{"LogLevel": "debug","LogPath": "","WSAddr": "127.0.0.1:8889","CertFile": "","KeyFile": "","TCPAddr": "127.0.0.1:8888",   "MaxConnNum": 20000,"ConsolePort": 8012,"ProfilePath": ""
}

H5测试链接Leaf服务器

Leaf服务器接到的测试结果:

H5接收到Leaf服务器发回数据测试结果:

H5客户端处理Leaf返回消息处理  

 function onMessage(evt) {console.log(evt);var filrReader = new FileReader();filrReader.onload = function() {var arrayBuffer = this.result;var decoder = new TextDecoder('utf-8')var json = JSON.parse(decoder.decode(new DataView(arrayBuffer)));console.log(json);};filrReader.readAsArrayBuffer(evt.data);};

Leaf服务器返回给H5的JSON消息结构
文件位置:server\login\internal\handler.go

package internal
import ("reflect""server/msg/protocolfile""github.com/name5566/leaf/gate""github.com/name5566/leaf/log"
)
func handleMsg(m interface{}, h interface{}) {skeleton.RegisterChanRPC(reflect.TypeOf(m), h)
}
func init() {// 向当前模块(login 模块)注册 Protocol.UserLogin 消息的消息处理函数 handleTesthandleMsg(&Protocol.UserLogin{}, handleTest)
}
// 消息处理
func handleTest(args []interface{}) {// 收到的 Test 消息m := args[0].(*Protocol.UserLogin)// 消息的发送者a := args[1].(gate.Agent)// 1 查询数据库--判断用户是不是合法// 2 如果数据库返回查询正确--保存到缓存或者内存// 输出收到的消息的内容log.Debug("Test login %v", m.LoginName)log.Debug("---------", Protocol.UserLogin{LoginName: "client",})dd := &Protocol.UserLogin{LoginName: "client",LoginPW:   "client",}//a.PlaySendMessage(dd)a.WriteMsg(dd)
}

测试结果

H5网页显示结果 如下:

参考:

https://www.yuque.com/docs/share/a8bc65cd-b1d9-4eff-88d1-10771552b121

golang leaf 游戏玩家注册、登录相关推荐

  1. golang Leaf 游戏服务器框架简介

    Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架.Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器. Leaf 的关注点: 良好的 ...

  2. Java实现注册登录系统——基于Java Swing实现

    技术简介:Java Swing 介绍 Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. ...

  3. java swing登录系统_Java实现注册登录系统——基于Java Swing实现

    技术简介:Java Swing 介绍 Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. ...

  4. Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

    最近,由于开发需要数据存储服务,就跑去Bmob看看,不看不要紧,发现自己以前创建的应用的数据存储服务居然变成非永久的了,只有一年的免费时间,而且还过期了.这对于我将要开发的软件时很不友好的:因此,我就 ...

  5. 64位游戏找call_《使命召唤16:战区》配置注册登录全攻略,三步让你极迅游戏!...

    如果说谁是2020年最火的游戏,那么<使命召唤16:战区>绝对是排名第一.自从<使命召唤16:战区>发布之后,同时在线人数就不断刷新纪录,一天300万,3天800万 ,到现在已 ...

  6. MYSQL练习题:连续两天登录的游戏玩家比率

    题目 Column Name Type player_id int device_id int event_date date games_played int (player_id,event_da ...

  7. 安卓大作业 安卓小游戏 养宠物战斗游戏(可以注册登录)

    宠物类养成游戏 (下载链接在文末)可以注册登录,移动开发大作业,适合初学者学习使用 详情如图: 点我下载资源 https://download.csdn.net/download/weixin_434 ...

  8. 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2

    [Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2 传统的登录验证模式 JWT登录验证方式 下载安装依赖 创建JWTUTIL JwtAuthenticati ...

  9. 游戏大数据分析--游戏玩家

    游戏玩家 1 新增玩家 1.1 新增设备激活:当日新增加的激活设备量.新增玩家账户:当日新增加的玩家帐户数 1.2 玩家转化:安装游戏的玩家中(即激活设备)有注册账户的玩家比例,1人多次注册,只记1次 ...

最新文章

  1. Mysql ERROR 145 (HY000)
  2. python函数调用语句_Python函数定义和函数调用
  3. 中专科学计算机应用基础试题及答案,职业中专《计算机应用基础》期中考试试卷...
  4. go 微服务框架_清晰架构(Clean Architecture)的Go微服务
  5. vb net的定时循环_.NET工具ReSharper:如何帮助Visual Studio用户?
  6. tcp假连接_ESTABLISHED状态的连接收到 SYN 会回复什么?
  7. ROS 科大讯飞语音 (一)环境搭建与准备
  8. python ddos 检测系统_python 检查是否存在ddos攻击
  9. 百度计算步行泰山18盘只要15分钟
  10. excel方格子插件_转载 | 18个Word/Excel/PPT插件整理
  11. javaweb框架介绍
  12. 51job导出的简历是php,前程无忧简历导出
  13. 【基础篇】————28、横向渗透
  14. 科学研究设计七:单案例设计
  15. IT面试技巧经典问答
  16. 扩展内存条 兼容性问题 双通道
  17. python删除表格第一行不动_Excel教程,教你如何设置表格第一行和第一列固定不动,一直显示...
  18. 音创ktv点歌系统服务器,音创ktv点歌系统家庭版
  19. Guava--Splitter使用方式
  20. mysql 默认排序是什么意思,MySQL 默认排序是什么

热门文章

  1. Http接口安全整理
  2. SpringMVC使用域对象共享数据
  3. jQuery,鼠标失去焦点事件
  4. 获取焦点和失去焦点事件
  5. 报错:fakeroot: preload library `libfakeroot.so‘ not found, aborting
  6. c语言怎么获取进程名,C语言实现由PID获取进程名由进程名获取PID
  7. CRMEB新零售社交会员管理营销电商系统!
  8. 自学python可以找到工作吗_通过自学python能找到工作吗
  9. 基于Android+Django+Python的服饰管理与个性化定制系统的设计与实现
  10. 360行,行行转Java,这句话到底是什么鬼呢?