《七雄争霸》游戏服务器数据库的设计与实现.doc_第1页
《七雄争霸》游戏服务器数据库的设计与实现.doc_第2页
《七雄争霸》游戏服务器数据库的设计与实现.doc_第3页
《七雄争霸》游戏服务器数据库的设计与实现.doc_第4页
《七雄争霸》游戏服务器数据库的设计与实现.doc_第5页
免费预览已结束,剩余22页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绪 论现如今人们已经离不开网络了。网络游戏已经成为人们休闲生活的主要方式之一 。网络游戏主要通过网络平台进行交流互动,无论是哪种网络平台,一般都是有服务器,数据库和无数的客户端组成的。一般的网络游戏都是采用这几种方式运行:(1)有一个或多个游戏服务器启动特定游戏服务。(2)游戏用户去游戏网站申请游戏账号ID,并下载游戏客户端。然后启动客户端程序,通过网络洗衣连接游戏服务器。(3)客户端程序负责处理客户端显示和操作界面,具有简单的逻辑处理功能,同时负责接收、发送与服务端交互的数据包。(4)服务器程序负责处理服务器端逻辑,游戏逻辑,游戏用户之间的网络信息传递,以及数据库之间的数据读取和保存工作,同时服务端还要承担游戏用户的客户端数据的接收转发工作。(5)网络游戏常常用到网络协议,有适用与Internet的TCP/IP协议,适用于局域网的IP协议。 在开发网络游戏时,首先要建立底层的网络通信类,利用网络通信类连接构建客户服务器之间的TCP/IP连接,然后在该链接的基础上利用自己的TCP/IP协议进行客户端登陆,进入大区,开始游戏,换游戏大区,和其他玩家互动等的操作,在以上协议基础同时在服务器端还需要和数据交互,用于读取或保存玩家信息(如玩家密码、个人资料等数据)。在网络游戏中数据库主要用来保存玩家资料,包括玩家的注册信息,玩家的游戏资料以及其他设置资料【1】。网络游戏的服务端在处理大量的玩家资料时,必然要用到数据库来进行大量的数据信息的存储和查询,服务器数据库中存储着玩家的注册信息,游戏设置信息等重要信息数据,通过网络游戏的架构也可以了解到网络游戏服务器。数据库连接着多个游戏客户端进行玩家数据的查询和修改,并且保持玩家数据的同步。在玩家注册游戏账户,登录服务器,保存游戏结果,退出游戏服务器都必须和数据库服务器进行交互,查询和保存玩家资料,当有大量玩家同时游戏时,所以必须保证数据库服务器的性能,以免造成数据处理缓慢,导致游戏服务器停止响应的后果。现在的网络游戏,数据越来越多,越来越复杂。合理地组织这些数据,并为服务器提供便于操作的接口,从而实现快速的数据访问是一个非常重要的工作。数据库技术为开发人员提供了一个良好的平台。第一章 系统需求分析1.1需求概述需求是每个系统必须符合的条件或具备的功能。需求是人们的期望,探索需求是人们的期望的过程。开发就是把人们的期望转化成一种能够满足其期望的产品的过程。需求是指用户要求软件系统必须满足的所有功能和限制。需求包括:功能要求、性能要求、安全保密性要求、以及开发费用和开发周期、可使用资源等方面的限制。其中功能需求是最基本的,包括数据要求和加工的要求。需求分析是系统开发的一个重要步骤,是整个系统开发的基础。如果需求定义错误(例如需求不完全、不合乎逻辑、不贴切或使人易于发生误解),那么不论以后各步的工作质量如何,都必然导致系统开发的失败。因此,系统开发中需求定义是系统成功的关键一步,必须引起足够的重视,并且提供保障需求定义质量的技术手段。需求的意义有在软件生命周期中,错误发现的越晚,修复错误的费用越高,许多错误是潜伏的,并且在错误产生后很长一段时间后才被检查出来。TRW公司的一项调查表明:54%的错误时在编码和单元测试阶段以后发现的,但实际上,这些错误的一半是属于需求和设计阶段的,而编码阶段的错误只有9%;需求的调查、分析、定义管理等过程中会产生很多错误,出错误时可以被检查出来的。需求定义必须满足以下几个方面的要求:(1)一致性。由于自然语言极易导致二义性,所以尽量把每项需求用简洁明了的语言表达出来。避免二义性的有效方法包括对需求文档的正规审查,编写测试用例,开发原型以及设计特定的方案脚本。(2)可理解性。参加的各方应能以一种共同的的方式来解释和理解需求。(3)完备性。所有需求都必须加以适当说明。(4)可行性。利用现有资源可以实现系统的需求。每一项需求都必须是在已知系统和环境的权能和限制范围内可以实施的。(5)必要性。所规定的需求必须是用户所需求。(6)正确性。需求应是准确和完整的。每一项需求都必须准确的陈述其要开发的功能。(7)可跟踪性。每一项需求都应该把客户真正所需要的和最终系统所需遵从的标准记录下来。(8)可测试性。需求必须能够验证。(9)划分优先级。给每项需求、特性或使用实例分配一个事实优先级以指明它在特定产品中所占的分量【2】。1.2数据库系统需求目前的主要任务是:调查和分析用户们的活动情况和数据的使用情况,明白所有数据的类型,范围,数据量和用户们的使用和交流的情况。确定用户们对数据库系统的使用要求规则和需求。游戏服务器数据库系统主要是完成登录游戏服务器,游戏大区服务器,游戏服务器,数据库服务器与数据库之间的交互。其主要分为两大部分,分别是登录服务器与数据库的交互,大区服务器与数据库的交互。系统需求大致可叙述为:(1)用户通过游戏客户端软件登录游戏服务器,服务器通过传递过来的用户名、密码到数据库中心验证,如果验证通过即可登录游戏,否则提示用户密码错误。(2)通过验证后,从数据库中读取出用户的个人资料如用户名、同时读取用户的游戏资料如积分、等级、金钱等参数。(3)用户选择游戏大区进行游戏。在大区里的游戏大区中可以进行物品的查收、装备的配置等的操作。操作完成后,程序调用数据接口保存用户相应的操作信息。(4)在用户结束一个游戏后,用户的游戏信息会发生改变。程序调用数据库接口保存用户游戏信息,如等级变化,金钱变化等资料【3】。第二章 系统设计2.1 MySQL概述MySql是一个小型关系型数据库管理系统,Sql是英文Atructured Query Language的缩写,意思是结构化查询语言。Sql语言的主要功能是对各种数据库进行管理。而MySql是一个真正的多用户、多线程的Sql数据库服务器,可以利用Sql语句对其执行很多操作,例如创建数据库、数据库表、操作数据等。MySql建立在客户服务器结构上的RDBMS,专门为了增强速度和稳定性而设计。现在有超过400万的网站建立、使用并配置了基于MySql的应用程序,而且网站的数量每天都在增加。他之所以能快速增长的原因,是相对于像Oracle和Microsoft SQL Server一样的更商业化、非开放源代码的系统来说,更遵守现有的Sql标准、友好的商业许可原则,都是促成MySql成为可实施的选择因素。MySql拥有较低的成本和更稳定、更安全的系统特性,使越来越多的企业把他们的系统移植到MySql,并且收获着MySql开放源代码带来的效益。MySql始终围绕三个基本原则设计的。分别为性能、可靠性和容易使用。严格按照这些准则产生了一个价格便宜而富有特色。适应标准而容易扩展、速度快而效率高的RDBMS,使MySql成为开发者和管理者建立、维护和配置复杂应用程序的完美工具。现在MySql的主要应用程序出现在网络舞台上,随着网站以及基于Web对分布式应用程序变得越来越复杂,有效管理数据来改善处理率、降低相应和提高用户的全面技能就变得越来越重要了。因此我们急需一个快速度的,稳定相高和安全的数据库【4】。2.2数据库设计概念正确的决策需原要正确的信息,正确的信息源自原始事实即数据存储于数据库时,才能最有效地管理它们。数据库是从计算机文件系统演变过来的。尽管文件系统数据管理已经在很大程度上过时了,但是理解这些文件系统的基本特性仍然很重要。及时有用的信息需要准确的数据。这样的数据必须正确地产生,而且必须易于访问和处理的格式适当的存储。有效的数据管理通常需要计算机数据库的使用。数据库时一种共享、集成的计算机结构,容纳以下数据的集合:终端用户数据、借以集成并管理数据的元数据或关于数据的数据元数据提供对数据特性以及连接数据库内数据的关系集合的描述。在某种意义上,数据库类似组织得非常有条理的电子文件柜,其中被称为数据库管理系统的一种强大软件帮助管理文件柜的内容。DBMS是程序的集合,这些程序管理数据库结构,并控制对数据库中所存储数据的访问。DBMS使多个应用程序或用户共用数据库中的数据成为可能。DBMS支持许多不同的数据库类型。数据库可以根据用户数量、数据库站点的位置以及预期的使用类型和范围来分类。概念设计阶段本质上是分析和发现的过程,目标是定义组织机构和用户对系统的数据需求。【5】要注意的是,将设计作为一个整体来看的话,概念设计阶段(以及后面的所有阶段)除了需要进行数据库设计之外,还要根据需求分析做出如下的表:Account用户信息:用于储存玩家账号信息。玩家注册账号时产生的信息,当玩家结束游戏任务要退出游戏时,玩家可在相应的界面看到自己的这些信息。该表属性:Accountid:玩家注册的账号Id Username:玩家的用户名 Password :玩家用户密码 Experience:玩家用户经验 Money:玩家用户的金钱 Level:玩家用户等级 Thing:存储用户道具信息,玩家用户买入和接收道具以及对道具进行各种操作时,这些数据将会有更新,玩家用户可以在游戏的相应界面看到这些信息。该表属性:Thingid:玩家的物品Id Account:玩家的物品所属玩家Id Thingtype:玩家物品类型 Bbind:玩家物品是否被绑定是否可交易 Active time:玩家物品的有效时间 Accessid:玩家物品在本地脚本数据库表的IdHsgcvrifycode:临时存储玩家用户登录的验证信息,用户登录时就会产生这些信息,用于用户进入游戏使用。玩家退出游戏后产生的这些信息将被删除。该表的属性:Hsgcverify Gode Id:登录验证Id Accont Id:登录用户Id Verify Code :验证码Gift:储存玩家礼物信息。用户赠送礼物事,会产生相应信息,被赠送玩家会在相应的游戏界面看到这些信息。该表属性:Giget Id:礼物的Id AccountId:接收礼物用户的IdThingType:礼物类型Benefactor:送礼物的用户DescText:礼物附带的描述以上表都是在游戏过程中与用户交互时生成的。此外,还有本地脚本数据库中的表(后缀为Access代表为本地数据库里的表),但这些表不在设计范围中,故不做详述。它们包括:CityAccess:存储游戏中城池的信息 城池的资源 城池的等级 城池的繁荣度RoleAccess:存储游戏中角色的信息GunAccess:存储游戏中装备的信息ItemAccess:存储游戏中物品的信息EmplaceAccess:存储城池位置信息后缀为Access代表为本地数据库里的表。2.3 数据库逻辑设计逻辑阶段是对概念阶段完成的工作进行细化。本阶段的成果将是关系数据库设计图,并且从本质上看设计图应该是完整的。要注意的是,一个好的逻辑设计能够建立在任何的RDBMS上。主要工作是将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式。与此同时,可能还需为各种数据处理应用领域产生相应的逻辑子模式。这一步设计的结果就是所谓“逻辑数据库【6】。在数据库概念设计完成之后,我们可进行数据库逻辑设计(1)创建数据库 Ocean在My Sql Command Line Client 中执行以下命令CREATE DATABASE Ocean;执行完毕后,数据库Ocean创建成功。(2)然后连接数据库Ocean。在My Sql Command Line Client 中执行USE Ocean;执行完毕后,提示数据库连接成功。(3)在数据库Ocean中创建表Account。在Mysql Command Line Client 中执行如下的命令;CREATE TABLE account(AccountID int (10)unsigened not null auto_increment,Usernamevarchar(45)character set latin 1 not null,Passwordvarchar(45)character set latin 1 not null,Experienceint(10)unsigned not null,Moneyint(10)unsigned not null,Levelint(10)unsigned not null,CurshipAccessIdint(10)unsigned not null,PRIMARY KEY (AccountId)ENGINE=Innodb AUTO_INCREMENT=16DEFAULT CHARSET=utf8;执行完毕后,表Account创建成功。(4)在数据库Ocean中创建表Gift在MySQL Command Line Client 中执行如下命令:CREATE TABLE gift(GiftIdint (10)unsigned not null, AccountIdint(10)unsigned not null,Thing Typeint(10) unsigned not null,AccessIdint(10) unsigned not null,Benefator varchar(45) not null,DescText varchar(45)not null,PRIMARY KEY (GiftId))ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;执行完毕后,表Gift 创建成功。(5)在数据库Ocean创建表Hsgcverifycode.在MySQL Command Line Clinet 中执行如下命令:CREAT TABLE hsgcverifycode(HSGCVerifyCodeId int(10) unsigned not null auto_increment,AccountIdint(10)unsigened not null,VerifyCode int (10)unsigned not null,PRIMARY KEY (HSGCVerifyCodeId)ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;执行完毕后,表Hsgcverifycod 创建成功。(6)创建表Thing。在MySQL Command Line Client 中执行如下命令:CREATE TABLE Thing(ThingId int (10)unsigned not null auto_increment,AccountIdint (10) unsigned not null,ThingType int(10) unsigned not null,bBindint (10)unsigned not null.bInstalled int(10) unsigned not null,Active Timeint (10) unsigned not null,AccessId int (10) unsigned not null,CityAccessIdint (10) unsigned not null,EmplaceIndex int(10) unsigned not null,PRIMARY KEY(ThingId) )ENGINE=InnoDBAUTO_INCREMENT=67DEFAULT CHARSET=latin1;执行完毕后,表Thing创建成功。第三章 系统难点技术分析与设计3.1系统架构设计与分析根据分析,设计出系统架构图,如图3.1所示。 登陆器游戏客户端游戏服务器大区服务器登录服务器数据库数据库处理服务器登录版本更新选择大区更换大区 游戏结束返回结束通知游戏开始信息登录登录登录登录查询、操作游戏调配图3.1 系统架构图 从图可以看出系统各个部分的工作情况以及数据的交互情况。可从两个部分来分析:(1)登录服务器与数据库服务器的交互。用户玩家由登录客户端登录服务器时,登录服务器请求数据库服务器执行登录验证操作,数据库服务器在对数据库进行查询操作,并返回查询结果。(2)大区服务器与数据库服务器的交互。 用户由客户端登录大区服务器时,大区服务器请求数据库服务器执行登录验证操作,数据库服务器再对数据库进行查询操作,并返回操作后的结果。 用户更换大区时,大区的服务器请求数据库服务器执行更换大区的操作,数据库服务器在对数据库进行相应的操作,并返回操作后的结果。 玩家对物品进行查询、配置、升级、丢弃、卖出、买入时,大区服务器请求数据库服务器执行相应操作,数据库服务器在对数据进行相应的操作并返回操作后的结果。 一场战争结束后,游戏服务器将游戏过程中各种信息的变化传给大区服务器,大区服务器请求数据库服务器执行数据更新操作,数据库服务器再对数据库进行更新操作,并返回更新后的结果。 玩家退出游戏时,大区服务器请求数据库执行退出操作,数据库服务器在对数据库进行相应的删除数据操作。 其中值得注意的一点:游戏服务器没有直接与数据库服务器进行交互,而是通过大区的服务器与数据库服务器进行数据的传递。之所以是这样,主要是因为像这中网络对战游戏不需要在游戏过程中实时更新数据,可以通过大区服务器,在一场战争结束游戏后,在进行游戏数据的更新。 下面结合系统需求,对架构图进行详细的分析:如表3-1 术语所示 表3-1 术语缩写全写定义LCLogin Client登陆器客户端LSLogin Server登录服务器GCGame Client游戏客户端HSHall Server大区服务器DSDB Server数据库处理服务器GSGame Server游戏服务器DBData Base数据库(1)LC登陆LS时,LS请求DS进行验证,验证内容为用户名和密码2项。DS在DB中查询是否有匹配信息。如果验证成功,则数据库中产生一个HSGC验证码,并然后反馈验证结果。否则提示用户登陆失败。(如图3.2)图3.2 LC登录LS流程图(2)GC登陆HS时,HS请求DS进行验证,验证内容为用户名和密码、HSGC验证码 3项。DS在DB中查询是否有匹配信息。 然后反馈验证结果,如果是成功的,那么附带用户信息,以及礼物信息。否则提示用户登录失败。(如图3.3)图3.3 GC登录HS流程图(3)GC已经在某个HS里,用户进行更换HS的操作时,HS请求DS进行更换大区操作,DS操作DB产生一个新HSGC验证码,然后返回新的HSGC验证码给HS。并进行更换大区操作。(如图3.4)图3.4用户更换大区流程图(4)GC已经在某个HS里,用户进行配置时需要激活道具、装备和角色,HS请求DS进行激活操作。DS操作DB,更改DB中相应数据。操作完成后,传回更新后的数据给HS,并提示操作成功。(如图3.5)图3.5 用户激活操作流程图(5)GC已经在某个HS里,用户点击丢弃按钮丢弃一个道具、装备或者角色,HS请求DS进行丢弃操作。DS对DB进行操作,更改DB中相应的数据。操作完成后,传回更新后的数据给HS,并提示操作成功。(如图3.6)图3.6 用户丢弃物品操作流程图(6)GC已经在某个HS里,用户点击确定按钮确认当前的道具、装备或者角色在船上的配置,HS请求DS进行确认操作。DS对DB进行操作,更改DB中相应的数据。操作完成后,传回更新后的数据给HS,并提示操作成功。(如图3.7)图3.7 用户确认物品操作流程图(7)GC已经在某个HS里,用户点击购买结算,HS请求DS进行结算操作。DS对DB进行操作,更改DB中相应的数据。操作完成后,传回更新后的数据给HS,并提示操作成功。(如图3.8)图3.8 用户购买结算操作流程图(8)GC已经在某个HS里,用户要赠送礼物,HS请求DS进行赠送操作。DS对DB进行操作,更改DB中相应的数据。操作完成后,传回更新后的数据给HS,并提示操作成功。(如图3.9)图3.9 用户赠送礼物操作流程图(9)GC已经在某个HS里,用户在收到礼物界面中,确认接收礼物时,HS请求DS进行接收操作。DS对DB进行操作,更改DB中相应的数据。操作完成后,传回更新后的数据给HS,并提示操作成功。(如图3.10)图3.10 用户接收礼物操作流程图(10)GC已经在某个HS里,用户在收到礼物界面中,确定丢弃礼物是,HS请求DS进行丢弃礼物操作。DS对DB进行操作,更改DB中相应的数据。操作完成后,传回更新后的数据给HS,并提示操作成功。(如图3.11)图3.11 用户丢弃礼物操作流程图(11)GC已经在某个HS里,用户查询礼物信息时,HS请求DS进行查询礼物信息操作。DS对DB进行查询,查询完成后,将查询到的数据返回给HS。(如图3.12)图3.12 用户查询礼物操作流程图(12)用户一局游戏结束后,用户的各种游戏信息会得到更新,GS将这些数据传给HS,HS请求DS进行数据更新操作并将数据传给DS。DS对DB进行相应的数据更新操作,操作完成后,将更新后的数据传回HS。(如图3.13)图3.13游戏结束后数据更新流程图(13)GC已经在某个HS里,用户退出游戏时,HS请求DS进行退出操作,DS删除DB中相应的HSGC验证码信息。(如图3.14)图3.14 用户退出游戏操作流程图3.2 将MySQL C API封装成易于使用的数据库接口3.2.1 MySQL C API 概述基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用。对外提供的API 调用使得站点之间的内容关联性更强,同时这些开放的平台也为用户、开发者和中小网站带来了更大的价值。 开放是目前的发展趋势,越来越多的产品走向开放。目前的网站不能靠限制用户离开来留住用户,开放的架构反而更增加了用户的粘性。在Web 2.0的浪潮到来之前,开放的API 甚至源代码主要体现在桌面应用上,而现在越来越多的Web 应用面向开发者开放了。 具备分享、标准、去中心化、开放、模块化的Web 2.0 站点,在为使用者带来价值的同时,更希望通过开放的API 来让站点提供的服务拥有更大的用户群和服务访问数量。 站点在推出基于开放API 标准的产品和服务后,无需花费力气做大量的市场推广,只要提供的服务或应用出色易用,其他站点就会主动将开放API 提供的服务整合到自己的应用之中。同时,这种整合API 带来的服务应用,也会激发更多富有创意的应用产生。【7】为了对外提供统一的API接口,需要对开发者开放资源调用API的站点提供开放统一的API接口环境,来帮助使用者访问站点的功能和资源。与其他很多同类型的商业软件不同,MySql通过一系列的API向开发者开放自己的内核,因此使他们能够自由地选择自己的语言创建数据库驱动的应用程序。MySql API可以为开发者提供一些具体能力,下面分别简要予以介绍。(1)链接管理:在一个应用程序能够与数据库交互并且对其中保存的数据进行查询之前,必须首先建立与数据库服务器的连接。MySql API包含了专门针对应用程序连接到MySql数据库服务器的一系列功能,可以提供各种申请证书,并且为以后的通信开放一个渠道。一旦所有通信完成,API还提供了一些功能来终止连接和释放被使用的内存,清除事件。(2)实施查询和处理结果:一旦连接建立,应用程序可以向服务器发送查询,并检索结果。MySql API提供了很多功能来简化这个过程,包括执行单个查询或者作为一个事务块的查询功能、检索和处理记录集合、收集来自集合的具体记录或来自记录的具体字段等。(3)报告错误:MySql API还提供了基本错误报告能力,当连接或查询出现问题时,能向调用者传递错误代码和信息。除此之外,API还允许调用者访问详细的排错和管理信息,包括当前服务器状态和所有活动过程列表等。(4)辅助功能:除了前面介绍的各种功能外,MySql API还可以提供很多所谓的管理功能,包括返回服务器的当前状态(打开连接的数量、得到处理的查询数量、服务器版本等);列出可以使用的数据库、表、字段和过程等;管理字符集;提供详细的诊断和排错信息;通过关闭不活动的连接和终止不活动的过程来清理没有使用的内存;关闭、重启或重载服务器等。MySql为很多不同的编程语言开放了API,使得可以使用自己选择的语言编写数据库驱动的应用程序。目前,MySql提供的接口API编程语言有C,Java,PHP,Perl,Python,ODBC,Ruby,Eiffel和Tcl等,应确保在构建自己的MySql应用程序时不会因缺少选择而造成问题。因为MySql是用C语言写成的,所以对MySql来说,显然C语言的API是功能最全面的一种。C语言的API通过Libmysqlclient库与MySql发布捆绑在一起,并且可以 被MySql附带的所有命令行工具使用。这些工具对于C开发者来说是理解API精髓的一个丰富的信息来源。【8】MySql提供的C API由一组函数以及一组用于函数的数据类型组成,这些函数与MySql 服务器进行通信并访问数据库,可以直接操控数据库,因而显著地提高了操控效能。C API数据类型包括:MYSQL(数据库连接句柄)、MYSQL_RES(查询返回结果集)、MYSQL_ROW(行集)、MYSQL_FIELD(字段信息)、MYSQL_FIELD_OFFSET(字段表的偏移量)、My_Ulonglong(自定义的无符号整型数)等。C API提供的函数包括:Mysql_Close()、MySql_Connect()、MySql_Query()、Mysql_Store_Result()、MySql_Init()等,其中MySql_Query()最为重要,能完成绝大部分的数据库操控。【10】C API通过两个组件实现:(1)头文件:MySql.h,包含结构和功能说明。(2)MySql库:LibMySqlClient(Unix) 或 MySqlClient.Lib(Windows),包括C的实际功能。C API描述:(1)初始化MYSQL结构:MySql_Init(&MySql);/ MySql 类型为 MYSQL,(2)建立到服务器连接:MySql_Real_Connect(&MySql, “Host”, “User”, “Password”, “DB1”, 0, NULL, 0);/采用默认值的三个参数分别为:连接MySql服务器时使用的端口,连接MySql服务器时使用的套接字,控制客户机行为使用的一个或多个可选标志。如果连接成功,将返回一个句柄,连接失败,将返回假。(3)选择数据库:MySql_Select_DB(&MySql, “DB_Name”);(4)查询实施:MySql_Query(&MySql, Query_String); (5)对Select查询返回的结果集处理:MYSQL_RES * Result = MySql_Store_Result(&MySql);/将查询的结果保持到变量Result。如果MySql_Query()执行出错,用MySql_Store_Query()函数取结果集将返回NULL给Result。如果客户机内存不大,可以每次检索一行记录: MySql_Use_Result()。Int NumRows = MySql_Num_Rows(Result);/检验结果集行数。Int NumFields = MySql_Num_Fields(Result);/检验结果集列数。MYSQL_ROW row = Mysql_Fetch_Row(Result);/从结果集读取一行记录。MYSQL_FIELD * Field = MySql_Fetch_Field(Result);/返回字段属性详细信息,如:字段名,类型,长度。MYSQL_FIELD* Fields=MySql_Fetch_Fields(Result); /返MYSQL_FIELD结构的数组,每个字段针对一个结果集合【11】。MySql_Free_Result(Result); /使用完后,要释放结果集变量空间。(6)INSERT,UPDATE、DELETE等操作的结果处理:MySql_Affected_Rows(&Mysql);/返回受影响的记录数。(7)涉及结果集处理的辅助函数:MYSQL_ROW_OFFSET STDCALL MySql_Row_Seek(MYSQL_RES *Result,MYSQL_ROW_OFFSET Offset);/跳至该具体行。MYSQL_FIELD_OFFSET STDCALL MySql_Field_Seek(MYSQL_RES *Result, MYSQL_FIELD_OFFSET Offset);/跳至该行具体列。MYSQL_ROW_OFFSET STDCALL MySql_Row_Tell(MYSQL_RES *RES); /返回字段列表中字段游标当前位置。MYSQL_FIELD_OFFSET STDCALL MySql_Field_Tell(MYSQL_RES *RES); /返回结果集中行游标当前位置。Unsigned Long * STDCALL MySql_Fetch_Lengths(MYSQL_RES *Result); /当前行的字段值长度。My_Ulonglong STDCALL MySql_Insert_Id(MYSQL *MySql); /返回产生ATUO_INCREMENT字段的最后ID。(8)错误处置:Unsigned Int STDCALL MySql_Errno(MYSQL *MySql);/错误号。Const Char * STDCALL MySql_Error(MYSQL *MySql);/错误信息。(9)关闭连接:MySql_Close (MYSQL* MySql);3.2.2 封装C API我们分别使用Database类(如图3.15)、DBInterface类(如图3.16)、Field类(如图3.17)、QueryResult类(如图3.18)、QueryResultMySql类(如图3.19)封装了MySql数据库的功能,因此不具备通用性,只能在对MySql的应用程序中使用。(1)Database类:主要负责初始化MySql结构以及建立到服务器的连接。图3.15 Database类(2)DBInterface类:是Database类的子类,负责初始化MySql结构以及建立到服务器的连接。图3.16 DBInterface类(3)Field类:主要负责对数据库表中内容的操作。图3.17 Field类(4)QueryResult类:主要负责对查询结果的存储以及操作。图3.18 QueryResult类(5)QueryResultMysql类:是QueryResult类的子类,负责对查询结果的存储以及操作。图3.19 QueryResultMysql类通过这些类中定义的这些功能函数,我们可以通过远程或本机完成对MySQL数据库的绝大部分操控,大大提高了效能。以上函数的具体功能都是通过调用C API函数实现的。【12】基于以上类,并结合系统各个部分的工作情况以及数据的交互情况。我们为数据库服务器提供如下对应的函数来实现每个部分的功能。(1) 陆登录服务器请求数据库服务器验证登录。Void ClientLSRecvPacketProcess:Handle_DSLS_C_LoginVerify(WorldPacket& wp, Unsigned Long Stub)(2)用户登录,大区服务器请求数据库服务器验证登陆。Void ClientHSRecvPacketProcess:Handle_DSHS_C_QueryLogin(WorldPacket& Wp, Unsigned Long Stub)(3)用户选择大区,大区服务器请求数据库服务器保存游戏客户端选择大区的操作。VoidClientHSRecvPacketProcess:Handle_DSHS_C_SaveSelectHS(WorldPacket& Wp, Unsigned Long Stub)(4)用户退出程序,大区服务器请求数据库服务器删除验证码。Void ClientHSRecvPacketProcess:Handle_DSHS_C_PlayerQuit(WorldPacket& Wp, Unsigned Long Stub)(5)游戏结束时,游戏服务器提交了用户信息变更数据给大区服务器, 大区服务器请求数据库服务器进行数据更新。Void ClientHSRecvPacketProcess:Handle_DSHS_C_UpdatePlayerInfo(WorldPacket & Wp, Unsigned Long Stub)(6)用户进行配置时需要激活道具、装备和角色,大区服务器请求数据库服务器进行激活操作。Void ClientHSRecvPacketProcess:Handle_DSHS_C_UserActiveThing(WorldPacket& Wp, Unsigned Long Stub)(7)用户点击丢弃按钮丢弃一个道具、装备或者角色,大区服务器请求数据库服务器进行丢弃操作。Void ClientHSRecvPacketProcess:Handle_DSHS_C_UserDiscardThing(WorldPacket& Wp, Unsigned Long Stub)(8)用户点击确定按钮确认当前的道具、装备或者角色在游戏中的配置,大区服务器请求数据库服务器进行确认操作。Void ClientHSRecvPacketProcess:Handle_DSHS_C_UserConfigThing(WorldPacket& Wp, Unsigned Long Stub)(9)用户点击购买结算,大区服务器请求数据库服务器进行结算操作。Void ClientHSRecvPacketProcess:Handle_DSHS_C_UserPay(WorldPacket& Wp, Unsigned Long Stub)(10)用户赠送礼物时,大区服务器请求数据库服务器进行赠送操作。Void ClientHSRecvPacketProcess:Handle_DSHS_C_Present(WorldPacket& Wp, Unsigned Long Stub)(11)用户接收礼物时,大区服务器请求数据库服务器进行收赠操作。Void ClientHSRecvPacketProcess:Handle_DSHS_C_ReceivePresent(WorldPacket& Wp, Unsigned Long Stub)(12)用户丢弃赠品时,大区服务器请求数据库服务器进行丢弃赠品操作。Void ClientHSRecvPacketProcess:Handle_DSHS_C_DiscardPresent(WorldPacket& wp, unsigned long stub)(13)用户查询礼物时,大区服务器请求数据库服务器进行赠品查询操作。Void ClientHSRecvPacketProcess:Handle_DSHS_C_RequirePresent(WorldPacket& wp, unsigned long stub)【13】第四章 系统运行测试数据库系统建立后,界面视图如图4.1。图4.1 数据库系统界面视图现在,我们模拟用户的一些操作,然后观察数据库中的变化。以此来观察数据库系统是否能正常运行。(1) 用户Ronaldo和Mess登录,其账号、密码验证成功后,表Hsgcverifycode中产生登录验证码以及相应数据。(如图4.2)图4.2 用户登录时,表Hsgcverifycode中的变化(2)用户Ronaldo更换大区,其验证码更新。(如图4.3)图4.3 用户更换大区后,表Hsgcverifycode中的变化(3)用户Mess分别购买1号和2号物品,点击确认后,其金钱以及物品信息在对应表中发生变化。(如图4.4,4.5)图4.4 用户购买物品后,其金钱数据更新图4.5 用户购买物品后,其物品信息更新(4)用户Mess将1号物品赠送给Ronaldo,表Gift中发生变化。(如图4.6)图4.6 用户赠送物品后,gift表中发生变化(5)用户Ronaldo接收礼物,其物品信息发生变化。(如图4.7)图4.7 用户接受礼物后,物品信息更新(6)用户Mess和Ronaldo激活自己的物品,物品信息发生变化

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论