棋牌游戏服务端设计

棋牌游戏服务端设计
服务器架构

游戏系统组件

  • 中心服

中心服用于向客户端提供全局配置及初始化,它不直接与玩家交互,主要维护游戏列表和房间信息,主要包括游戏类型、游戏种类、房间信息、在线等。

中心服配置主要包括网络配置和数据库配置,网络配置包括监听端口、最大连接数,这里的最大连接数是指最多支持多少个登录服和房间服,因为只有这两种服务器会连接中心服。数据库配置主要包括服务器数据库所在机器的IP和端口以及账户密码。中心服会根据这些配置来管理游戏列表、房间列表等信息。

  • 登录服

登录服主要提供玩家注册与登录校验,它可定时从中心服取回游戏列表和房间信息,因为这些数据在不断变化,登录服需要在玩家登录时将这些信息返回。

  • 大厅服

大厅服主要用于玩家连接游戏,创建房间、加入房间、比赛模式服务自动分配房间。

  • 房间服

房间服控制游戏房间的启动、停止、添加、删除等管理操作,它可在启动时向中心服注册,关闭时从中心服注销。玩家进入房间时通知中心服更新在线人数,并定时连接中心服更新游戏列表和房间信息。

房间服务器启动时,先要发送请求给中心服进行注册,在关闭时要从中心服中注销。同时会定时通知中心服更新在线人数,定时从中心服上取回最新的游戏列表和房间信息。

房间服需要和玩家进行交互,玩家进入房间,找桌子坐下时请求由自己来处理。而游戏操作如加注、发牌等,房间服会转发给游戏模块进行处理。

房间服管理着在线用户列表,在玩家进入房间和离开房间时都需要更新在线数据,在线列表中记录的玩家信息从玩家库中加载。玩家在进行游戏时,由于输赢的关系玩家积分或游戏币都会随之变化,为了记录这些变化,它需要和游戏库进行交互。

管理员可通过房间服来发布消息、踢出玩家、警告玩家、设置玩家权限、设置房间属性等活动。玩家也可以通过房间服参与聊天。

玩家的大部分操作都是和房间服来响应的,启动一个房间服实例相当于开启一个新的房间,所以要扩容基本上只需要增加机器并开启更多的房间服即可。房间服的配置主要包括房间基本信息、网络配置、数据库配置、与中心服相关配置。房间基本信息包括房间类型、桌子数、椅子数等。网络配置主要包括监听端口和最大连接数,这里的最大连接数是指房间内最多支持多少玩家同时在线。房间服和登录服一样,需要定时从中心服更新游戏列表和房间信息发送给客户端。

  • 数据库

保存用户信息、游戏数据、系统运行状态、日志等

游戏系统结构

采用多服分布式架构,由一个中心服(CenterServer)、多个主服务器(MainServer)、多个从服务器(LocalServer)同时工作以实现游戏逻辑、用户管理、通讯等功能。

  • 中心服:向客户端提供全局配置以及初始化数据,主要是定位一个主服务器的IP地址。
  • 主服务器:管理客户端用户身份验证与登录、管理从服务器的建立、数据库读写
  • 从服务器:管理客户端游戏通信、大厅与房间等,可*添加、删除、修改。

游戏系统流程

游戏玩家登录

客户端用户在登录场景中点击登录,登录方式可能是游客、微信等。登录实际上是请求玩家的信息、游戏服IP与端口、玩家房间信息等。当用户登录成功后,会使用获取到的IP和端口跟游戏服建立长连接,同时会根据房间信息,选择进入大厅或是游戏。

玩家开房

  1. 客户端将用户账户密码发送给登录服执行登录操作,登录服验证成功后返回游戏列表给客户端。
  2. 玩家选择具体游戏后进入房间,客户端发送请求给房间服务器,房间服务器将房间信息返回给客户端显示。
  3. 玩家选择桌子坐下开始游戏时,客户端将游戏动作发送给对应的房间服务器,房间服务器将操作解析后转发给游戏逻辑模块进行处理,并将处理结果返回给客户端。
棋牌游戏服务端设计
玩家开房

用户与服务器交互流程

  1. 系统是首先启动中心服,中心服从配置文件中读取主服务器列表、客户端所需的全局配置、初始化数据等。
  2. 中心服等待客户端的连接,客户端连接后中心服将定位到某个主服务器的IP地址和端口,发往客户端。
  3. 客户端收到主服务器信息后,与中心服断开连接。
    主服务器启动后,可以在主服务器中创建多个从服务器与房间,创建完成后从服务器的IP和端口就作为唯一标识写入数据库和主服务器内存。
    房间号、房间所属游戏类型、所属从服务器编号作为房间的房间的唯一标识被写入数据库和主服务器内存。
    从服务器创建以后,就在它所属的机器上启动。
  4. 客户端与主服务器建立连接
    客户端登录后首先和主服务器建立连接,一直到客户端退出时才断开。建立连接成功后生成界面结构树。
  5. 主服务器从数据库中读取从服务器信息到主服务器内存
    首先读取游戏类型以建立基本信息,然后读取界面树节点以获取客户端界面结构、从服务器信息、大厅与房间信息。

客户端请求登录并成功与主服务器连接时,主服务器将这些信息一次性发送到客户端内存,客户端根据这些信息生成界面结构树。

当用户点击某个游戏房间时,系统从内存中读取房间信息,根据房间所属的从服务器IP和端口,尝试和从服务器建立连接,连接成功后从服务器会将房间信息发送给客户端。客户端收到后根据这些信息生成房间。

每当客户端游戏位置发生改变时将向从服务器发送改变信息,从服务器保存、修改所有与之连接的客户端的位置信息列表。

当房间桌子坐满时游戏开始,游戏开始后客户端与从服务器通信并更新游戏信息。

当客户端退出游戏即返回大厅这个房间。当退出大厅时首先和从服务器断开连接,然后和主服务器断开连接,最终终止整个客户端程序。

游戏组件模块

组件模块以中心数据管理模块为中心,数据库处理模块和socket管理模块提供外部操作联系。

棋牌游戏服务端设计
游戏组件模块