游戏系统组件包括:
系统选用的开发工具是优秀的Microsoft Visual C++.net2003,系统采用客户端/服务器(C/S)编程模式,TCP/IP协议作为客户端和服务器的通信网络层,运用具有性能最优的完成端口(IOCP:Input/Output Completion Port )网络开发模型搭建服务器软件.客户端采用WinSocket API作为网络层。
系统采用多服务器分布式架构,由一个中心服务器(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包括以下子模块:
组件模块以中心数据管理模块为中心,数据库处理模块和SOCKET管理模块提供外部操作联系。以下是对每个模块的功能和接口的介绍:
网络应答线程,等待外部连接,激活一个空闲的 SOCKET 对象,设置 SOCKET 参数,并把这新的 SOCKET 对象绑定到完成端口,然后投递缓冲区为零的数据读取操作调用,继续等待下一个外部连接,详细的算法见代码。
一个网络管理类提供了 CUP*2+2 个 SOCKET 消息响应线程,负责处理网络数据的发送,读取,关闭消息处理,详细的算法见代码。
一个网络管理类提供了一个数据群发线程,负责处理数据的群发异步操作。此线程采用优化的队列方式处理群发数据,避免了队列的数据移动而带来的数据拷贝操作,加快了处理速度,详细的算法见代码。
一个网络管理类提供了一个SOCKET 维护线程,负责维护断线或者超时的 SOCKET 对象,每个 SOCKET 对象自动被激活开始,服务器就会大约 15 秒向客户端发送一个检测数据包,客户端会在收到此检测数据包的时候马上向服务器返回同样的检测数据包。在这前题条件下,维护线程就会大约 15 秒向所有的 SOCKET 对象都发送一个检测数据包,并关闭掉没有响应的 SOCKET 对象,详细的算法见代码。
主要有的线程介绍:
模块编写实际类分布:
每个游戏模块(继承于IModuleManageService接口),都包含了数据管理模块(继承于CBaseMainManage类)和数据库处理模块(继承于CDtaBaseHandle类),实现了模块的启动,停止,初始化,卸载功能,每个模块需要继承重写的部分就是数据库处理模块和数据管理模块;
数据管理模块包含了此组件的数据信息,逻辑处理,负责处理和发送网络数据包,更具需要投递数据库处理请求,处理数据库处理结果。实现了网络数据包投递接口,数据库处理结果处理接口;
数据库处理模块包含了处理数据库请求处理,发送数据库处理结果到数据管理模块处理。实现了根据请求,实现合适的数据库操作;
数据库管理类和网络管理类对象存在于CBaseMainManage类中,而实际的数据库操作类是个独立的类,存在于模块管理类中,在模块初始化的时候把此类的对象指针传递到数据库管理类,供数据库管理类调用。
游戏房间模块示意说明:
游戏房间模块是应用得最多模块之一,于其他模块最大的不同点的是中心数据管理类(继承于CbaseMainManage类的CComMainManage类;
数据管理类继承于基础数据管理类,还存在CComUserInfoManage用户管理类和CComDesk游戏桌子类对象数据。