微信号:CocosEngine

介绍:Cocos引擎官方账号,第一时间为您送上引擎动态、精品教程、达人专访等干货,还会定期举办有奖活动喔!

Part II:服务端和网络通讯知识解析

2018-02-28 23:55 C姐

服务端和网络通讯知识直播视频



本次直播内容分为三个主要部分:

- 开发环境配置

- 服务端架构讲解

- 游戏业务逻辑讲解

开发环境配置


 数据库搭建  

1、前往 MySQL 官网 https://dev.mysql.com/downloads/ 下载 MySQL Community Server 和 MySQL Workbench

2、完成安装,确认 MySQL 服务已经运行

3、打开 MySQL Workbench,进入默认的 connection,新建一个 schema,命名为 `nodejs`

4、在 Workbench 里的「文件」菜单选择 `Run SQL script`,然后选择幼麟框架里的 `server/sql/db_babykylin.sql`,并在 `nodejs` 这个数据库里执行。

5、当看到 Tables 已经更新到如下状态,数据库就配置成功了



服务端开发环境


服务器的开发环境只要求 Nodejs v4.6 以上,直播时使用 Nodejs v6.3 版本。 服务端分为三个不同的服务器进程:

- account_server 帐号服务器

- hall_server 大厅服务器

- game_server 游戏服务器


要运行游戏测试,需要把三个服务器进程都跑起来,我们在 windows 环境下已经有了 `1.account_server.bat`, `2.hall_server.bat`, `3.game_server.bat` 三个批处理文件,分别用于运行三个服务器进程。


当需要调试某一个进程的时候,我们可以在命令行运行其他两个服务器进程,然后使用 VSCode 的调试工具运行开发中的进程。


我们把 VSCode 调试配置放在了下面的链接里:

http://forum.cocos.com/t/7-4/48337


将这里的内容替换 `launch.json` 后,在调试界面选择 `Debug Account`, `Debug Hall`, `Debug Game` 即可启动相应的调试进程。


服务端架构详解


幼麟棋牌游戏框架的服务端分为三个服务器进程,其中游戏服务器是可以根据需要随时添加新的机器和进程的。他们的作用如图所示。



接下来我们依次讲解每个服务器进程中的重点接口和内容。


  account 帐号服务器  

除了入口程序之外,主要接口都在 `account_server.js` 脚本里。这个脚本通过 `configs.js` 中的配置运行 express http 服务器并实现以下接口:

- /register 注册新用户(游戏中未使用)

- /get_version, /get_serverinfo 获取版本号,服务器信息

- /guest, /auth 游客登录, 帐号密码登录

- /wechat_auth 微信登录


  hall 大厅服务器  

大厅服务器负责连接用户和房间,并在用户开房时负责游戏服务器的负载均衡分配。 主要包括两个脚本:


  客户端服务 client_service.js  

这个脚本提供了面向客户端的 http 接口,包括:

- /login 返回用户档案和检查 room_id (如果有的话)

- /create_user 创建角色

- /create_private_room 创建房间

    - 传入玩法类型和房间规则

    - 检查玩家是否已在房间

    - 调用 room_service.createRoom

- /enter_private_room 进入房间


这些接口都是直接由客户端发起 http 请求访问的,接到请求后会首先根据客户端发来的数据进行基本的验证,然后会转入到数据库脚本 `db.js` 或大厅服务器的实际业务脚本 `room_service.js` 继续执行。


  房间服务 room_service.js  

- /register_gs 注册游戏服务器,维护 serverMap 表,用于负载均衡

- createRoom

    - chooseServer (选择房间数最少的服务器)

    - 检查房卡数

    - 根据房间配置,房卡数生成校验码

    - 跨进程(主机)访问 game 服务器, http_service-> /create_room

- enterRoom

    - 从数据库查找房间所在服务器

    - 检查房间是否正在运行

        - 是:向房间所在服务器请求 http_service/enter_room

        - 否:选择服务器,并进入游戏服务器的开房逻辑


  game 游戏服务器  

游戏服务器里也包含接口和业务逻辑两类脚本,面向大厅服务器的接口在 `http_service.js` 里。


http_service.js

- /create_room 调用 roommgr.createRoom

- /get_server_info gameServerInfo,用于获取多个游戏服务器的信息

- update 定时向大厅服发送心跳请求 room_service/register_gs

- /enter_room 调用 roommgr.enterRoom,安排玩家在方位落座


接到请求以后,进行基本的数据验证后,就继续调用 `roommgr.js`, `usermgr.js`, `tokenmgr.js` 等实际逻辑脚本。


  roommgr、usermgr、tokenmgr  


roommgr

- createRoom 选项同步问题

    - 随机生成房间号

    - 房间号查重,重复的话递归重新生成

    - 创建逻辑:初始化 roomInfo,roomInfo.seats,在数据库创建房间

- destroy 销毁房间

- enterRoom 进入房间

    - takeSeat 选择一个空的座位,更新服务器房间信息

- setReady 单用户准备完毕

- isReady 检查某用户是否ready

- userLocation  {roomId, seatIndex}

- exitRoom

- constructRoomFromDb 用于从数据库恢复房间信息(服务器重启)


tokenmgr: 用于 socket 登录时验证用户身份


usermgr 用户 socket 连接管理

- bind 绑定 userId 和 socket 连接

- del,get,isOnline 针对特定 userId 查询和操作

- sendMsg 向特定 userId 发送 socket 消息

- kickAllInRoom 将房间中所有玩家移除,断开连接

- broacastInRoom 向房间里所有玩家广播 socket 消息,可选择跳过消息起始方


进入房间流程详解


幼麟棋牌框架里面向客户端和其他服务器的接口都拆分在了不同的脚本里,而接口脚本在校验数据后会继续调用其他业务逻辑脚本里的方法来继续执行。这样的结构在刚开始学习后端架构时可能会感觉比较绕,下面我们用一个用户进入房间流程的实际解说来帮大家理清服务器间的逻辑关系。


进入房间流程(http 部分)

- 客户端访问 client_service/enter_private_room

- room_service.enterRoom

- http_service/enter_room

- roommgr.enterRoom 在完成就座和更新数据库的房间信息后,回调中生成 token,并按来路将 token 回调至 client_service/enter_private_room

- 回调至客户端 UserMgr.enterRoom,使用 token 调用 GameNetMgr.connectGameServer

- socket 连接成功后,发送 login 消息



面向客户端的 socket 连接接口 socket_service

当玩家进入房间后,我们就将为每个玩家建立一个 socket 连接,并通过 socket_service 进行通讯和管理。牌桌场景上客户端的一切交互都将通过 socket 连接发送到服务器,服务器进行业务逻辑计算后再将结果和每个玩家能进行的操作下发至每个客户端。


下面是 `socket_service.js` 里实现的主要接口:

- login 验证用户身份,流程包括

    - 验证 token,userId, roomId,sign

    - 调用 userMgr.bind 绑定 userId 和 socket 连接

    - 生成 seats 信息并通过 login_result 和 new_user_comes_push 来发回登录客户端和其他房间里的客户端

    - 发送 login_finished 消息,客户端会在回调中加载牌桌场景

- ready, huanpai, chupai, peng, gang, hu, guo 等打牌相关行动消息回调


游戏服务器需要向客户端下发消息时,使用

- socket.emit('message') 向单个客户端发送消息

- usermgr.broacastInRoom 向所有房间里的用户广播消息,可以选择跳过消息起始方。

 
COCOS 更多文章 国内顶级游戏上市公司开启 Cocos 专业人才招聘! 基础 | 微信「跳一跳」带火小游戏,开发者如何快速上手? Cocos 祝各位同学 2018 继续精彩! 春节自救完整指南 Cocos 2017 十大高亮推文,回顾依然精彩!
猜您喜欢 2015Postgres全国大会热点嘉宾:萧少聪 且说付费 Machine Learning-线性回归算法分析 WordPress:如何应用Kubernetes和Portworx实现高可用和可扩展性 Android开发中一些被冷落但却很有用的类和方法