热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络棋牌游戏服务器架构

一、物理架构说明游戏系统组件包括:服务器系统(中心服务器的控制系统,服务器登陆控制的系统,游戏登陆服务器,游戏房间控制的系统,游戏组件系统),游戏客户端(游戏大厅,游戏组件)。数据库系统:

一、物理架构说明

  游戏系统组件包括:

  •   服务器系统(中心服务器的控制系统,服务器登陆控制的系统,游戏登陆服务器,游戏房间控制的系统,游戏组件系统),游戏客户端(游戏大厅,游戏组件)。
  •   数据库系统:用于保存用户的信息数据、游戏积分数据、游戏系统运行状态的数据以及系统日志数据等数据。
  •   中心服务器的控制系统:用于向客户端提供全局配置及初始化数据使用。
  •   服务器登陆的控制系统:用于房间服务控制系统的登陆效验使用。
  •   游戏房间的控制系统:用于控制游戏房间的启动,停止,添加,删除,管理等等。
  •   游戏组件系统:用于具体游戏服务,被游戏房间控制系统挂接,提供游戏服务。
  •   游戏大厅:游戏玩家连接游戏使用。

二、系统结构

  系统所选用的开发工具是优秀的MicrosoftVisualC++.net2003,系统是采用了客户端/服务器(C/S)编程模式,TCP/IP协议作为客户端与服务器的通信网络层,运用了具有性能最优的完成端口(IOCP:Input/OutputCompletionPort)网络开发模型以搭建服务器软件,客户端采用WinSocketAPI作为网络层。

  系统采用了多服务器分布式的架构,由一个中心服务器CENTERSERVER和多个主服务器MainServer以及多个从服务器(LocalServer)同时工作以实现游戏逻辑和用户管理及通讯的功能。中心服务器向客户端提供全局配置,初始化数据(主要是定位一个主服务器IP地址),主服务器管理客户端用户身份验证、登录以及管理从服务器的建立,由多个从服务器管理游戏通信,大厅及房间,从服务器可任意添加、删除、修改等。

  系统首先启动中心服务器(CENTERSERVER),中心服务器从INI文件中读取MainServer列表信息,客户端提供全局配置,初始化数据,然后等待客户联结,客户联结后CENTERSERVER定位一个MainServer的IP地址和端口号,发往客户端,客户端收到后断开CENTERSERVER的联接,并马上用MainServer的IP地址和端口号,和主服务器(MainServer)连接.主服务器从数据库中读取从服务器的所有信息到主服务器的内存。首先读取ComType表以建立所有的游戏类型的基本信息,然后读取ServiceInfo(界面树结点信息表)以获得包括客户端界面结构、从服务器的信息、大厅和房间的一切信息。当有客户端请求登录并成功和主服务器连接的时候,主服务器将这所有的信息一次性发到客户端内存,客户端根据这些信息生成界面结构树。

  主服务器启动后还可以在主服务器里创建多个从服务器及房间,创建完成后从服务器的IP地址及端口号就作为它的唯一标识被同时写进数据库和主服务器的内存;房间号、房间所属的游戏类型、所属的从服务器号也作为房间的唯一标识被同时写进数据库和主服务器的内存。

  从服务器创建以后就在它所属的机器上启动。

  客户端登录后首先和主服务器建立连接(并且一直到客户端退出才断开)连接成功后生成界面结构树(前述),当用户点击某个游戏房间的时候系统从内存中读出这个房间的所有信息(前述),根据房间所属从服务器的IP地址及端口号试图和这个从服务器建立连接,连接成功后相应的从服务器就将这个房间的所有信息发到这个客户端,客户端收到以后就根据这些信息生成房间。每当有客户端的游戏位置发生改变的时候就向从服务器发送改变信息,从服务器保存、修改所有与它连接的客户端的位置信息列表。

  当一张桌子坐满时游戏开始。游戏开始后客户端也是和从服务器通信以更新游戏信息。当客户端退出游戏后就回到大厅的这个房间,当退出大厅的时候首先和从服务器断开连接,然后和主服务器断开连接,最后终止整个客户端程序。

三、模块结构

  系统包括三大主要模块结构:MainServer,LocalServer,Com.此外还有客户端安装,更新模块等。在三大主要模块结构中还有子DLL(动态链接库)模块。

  1、MainServer(EXE项目):封装主服务器功能,包括管理客户端用户身份验证、登录以及管理从服务器的建立,数据库读写等。

  2、LocalServer(EXE项目):封装从服务器功能,包括管理客户端游戏通信,游戏逻辑,大厅及房间等。

  3、Com(EXE项目):封装客户端所有功能,包括客户端登录,大厅及房间,客户端游戏通信,游戏逻辑等。Com包括以下子模块:

  客户端通用库PubLib(DLL模块)封装了客户端通用的调用接口,控件,类。供客户端所有的模块调用.

  麻将游戏通用库MJLib(DLL模块)封装了客户端麻将游戏通用的调用接口类和十堰麻将类。通用的调用接口类供特殊的麻将游戏模块调用。

  扑克牌游戏通用库PisaLib(DLL模块)封装了客户端扑克牌游戏通用的调用接口类。通用的调用接口类供特殊的扑克牌游戏模块调用。

  大厅库RoomLib(DLL模块)封装了客户端大厅的调用接口。

  象棋库XQLib(DLL模块)封装了客户端象棋的调用接口。

  围棋库XQLib(DLL模块)封装了客户端围棋的调用接口。

  军棋库XQLib(DLL模块)封装了客户端军棋的调用接口。

  • 服务器架构示意图:

  • 组件模块结构示意图:

 

  组件模块以中心数据管理模块为中心,数据库处理模块和SOCKET管理模块提供外部操作联系。以下是对每个模块的功能和接口的介绍:

1 中心数据管理模块继承于CBaseMainManage类,主要是协调各个模块的联系,处理模块的逻辑处理,保证数据的完整性和合理性和合法性。中心数据管理类是单线程类,使用单线程的目的是为了使数据的处理避免了同步问题,数据的操作不需要使用临界变量锁定数据,加快了处理速度,但前题条件是数据处理中,不能出现长时间的数据等待,锁定操作存在。中心数据管理类实现了IServerSocketService网络数据处理接口和IDataBaseResultService数据库结果处理接口,提供了网络模块和数据库模块的进入接口,这两个接口是供网络模块和数据库模块调用(意思就是调用线程不是于中心管理模块的处于同一线程内,要注意数据同步问题)。数据管理模块对于这些接口调用的处理方式是先把投入的数据处理包分类,分别分为网络定时器数据包,网络读取数据包,网络连接关闭数据包,数据库结果数据包,打包为数据管理类识别的数据形式,投递到数据管理类的处理队列,等待数据管理类处理。当中心数据管理类需要投递数据库操作的时候,就通过数据管理类的IDataBaseHandleService接口投递请求(异步方式),当数据库处理完毕后,数据库管理模块会调用中心管理类的IDataBaseResultService数据库结果接口。

2 SOCKET管理模块CTCPSocketManage类,主要是实现了管理网络连接资源,处理网络SOCET的读写操作,主要提供了单SOCKET发送函数,群发SOCKET函数,SOCKET关闭函数,提供SOCKET事件通知。网络管理类是多线程处理类。单SOCKET发送函数是SendData函数,存在着多种重载实现,提供不同的数据发送请求,群发SOCKET函数是SendDataBatch函数,关闭SOCKET函数是CloseSocket函数,存在着多种重载实现,当发送了网络消息读取事件,此类主要是通过调用OnNetMessage虚拟函数,利用IServerSocketService接口把数据读取数据包投递到中心数据管理类。当网络关闭的时候,也通过IServerSocketService接口把数据读取数据包投递到中心数据管理类。(详细的实现见代码)

 主要有的线程介绍:

      •   staticunsigned__stdcallThreadAccept(LPVOIDpThreadData)(SOCKET连接应答线程)

  网络应答线程,等待外部连接,激活一个空闲的SOCKET对象,设置SOCKET参数,并把这新的SOCKET对象绑定到完成端口,然后投递缓冲区为零的数据读取操作调用,继续等待下一个外部连接,详细的算法见代码。

      •   staticunsigned__stdcallThreadRSSocket(LPVOIDpThreadData)(SOCKET数据接收线程)

  一个网络管理类提供了CUP*2+2个SOCKET消息响应线程,负责处理网络数据的发送,读取,关闭消息处理,详细的算法见代码。

      •   staticunsigned__stdcallThreadBatchSend(LPVOIDpThreadData)(SOCKET批量发送数据线程)

  一个网络管理类提供了一个数据群发线程,负责处理数据的群发异步操作。此线程采用优化的队列方式处理群发数据,避免了队列的数据移动而带来的数据拷贝操作,加快了处理速度,详细的算法见代码。

      •   staticunsigned__stdcallThreadKeepActive(LPVOIDpThreadData)(SOCKET维护线程)

  一个网络管理类提供了一个SOCKET维护线程,负责维护断线或者超时的SOCKET对象,每个SOCKET对象自动被激活开始,服务器就会大约15秒向客户端发送一个检测数据包,客户端会在收到此检测数据包的时候马上向服务器返回同样的检测数据包。在这前题条件下,维护线程就会大约15秒向所有的SOCKET对象都发送一个检测数据包,并关闭掉没有响应的SOCKET对象,详细的算法见代码。

  

3 数据库管理模块,主要包括了数据库管理CAFCDataBaseManage类和数据库处理CDataBaseHandle类(继承于IDataBaseHandleService接口)。CAFCDataBaseManage只实现了数据的连接、关闭操作和数据库操作请求的投递任务,而实际的数据处理是根据不同的模块进行不同的数据库处理操作,通过CDataBaseHandle实现实际的数据操作。这样就避免了不同的数据库操作重复编写数据库的维护,连接等代码。CAFCDataBaseManage在会启动一个DataServiceThread线程,等待数据库处理请求操作数据包,交到类的成员变量CDataBaseHandle指针处理。

  •   模块编写实际类分布:

 

  每个游戏模块(继承于IModuleManageService接口),都包含了数据管理模块(继承于CBaseMainManage类)和数据库处理模块(继承于CDtaBaseHandle类),实现了模块的启动,停止,初始化,卸载功能,每个模块需要继承重写的部分就是数据库处理模块和数据管理模块。

  数据管理模块包含了此组件的数据信息,逻辑处理,负责处理和发送网络数据包,更具需要投递数据库处理请求,处理数据库处理结果。实现了网络数据包投递接口,数据库处理结果处理接口。

  数据库处理模块包含了处理数据库请求处理,发送数据库处理结果到数据管理模块处理。实现了根据请求,实现合适的数据库操作。

  数据库管理类和网络管理类对象存在于CBaseMainManage类中,而实际的数据库操作类是个独立的类,存在于模块管理类中,在模块初始化的时候把此类的对象指针传递到数据库管理类,供数据库管理类调用。

  •   游戏房间模块示意说明:

  游戏房间模块是应用得最多模块之一,于其他模块最大的不同点的是中心数据管理类(继承于CbaseMainManage类的CComMainManage类)

  数据管理类继承于基础数据管理类,还存在CComUserInfoManage用户管理类和CComDesk游戏桌子类对象数据。


推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 如何高效地安装并配置 PostgreSQL 数据库系统?本文将详细介绍从下载到安装、配置环境变量、初始化数据库、以及优化性能的全过程,帮助读者快速掌握 PostgreSQL 的核心操作与最佳实践。文章还涵盖了常见问题的解决方案,确保用户在部署过程中能够顺利解决遇到的各种挑战。 ... [详细]
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 英语面试技巧:提升个人技能与表现
    在英语面试中,个人技能是指除专业知识外,能够促进职业发展的各种能力。虽然你可能具备多种技能,但建议重点突出与目标岗位最相关的几项,以增强面试官对你专业能力和适应性的认可。 ... [详细]
author-avatar
lewis_and_his_wife_480
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有