《服务器核心概要设计(43页).doc》由会员分享,可在线阅读,更多相关《服务器核心概要设计(43页).doc(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-服务器核心概要设计-第 43 页服务器核心模块概要设计1引言1编写目的1背景12总体设计2需求规定2运行环境2开发环境2基本设计概念和处理流程2调用模型2基于事件驱动的数据处理模型2事件数据设计3框架体系设计3功能模块划分33模块详细设计4数据队列服务QueueService模块设计4基本设计概念4类与接口设计4运行流程8网络引擎TCPSocketEngine模块设计8网络重叠完成端口IOCP简介8基本设计概念9网络数据命令包结构设计10网络数据加密设计10类与接口设计11数据库引擎DataBaseEngine模块设计11基本设计概念11类与接口设计11运行流程22定时器引擎TimerEng
2、ine模块设计23基本设计概念23类与接口设计23运行流程26调度引擎AttemperEngine模块设计26基本设计概念263.类与接口设计26运行流程30异步引擎AsynchronismEngine模块设计313.基本设计概念31类与接口设计31运行流程34服务引擎ServiceEngine模块设计35基本设计概念35类与接口设计35运行流程401 引言1.1 编写目的方便二次开发人员理解服务器核心技术1.2 背景3.3.1 为一般游戏服务器设计的核心模块3.3.2 本项目的任务开发者:Godzilar系统使用用户: 游戏服务器二次开发人员2 总体设计2.1 需求规定3.3.1 系统功能提
3、供网络服务接口,数据库访问接口,定时器接口,并提供调度钩子接口,让二次开发人员调用,更多精力处理游戏逻辑3.3.2 系统性能网络负载支持2000同时在线连接以上数据库访问支持100并发访问定时器时间精度达25ms之内2.2 运行环境硬件平台:x86体系结构软件平台:Window2003操作系统2.3 开发环境开发工具:Visual C+ 2003开发语言:C+2.4 基本设计概念和处理流程2.4.1 调用模型利用面向对象思想多态性,调用方保存着被调用方的基础接口指针(一般称呼为 钩子),调用方直接调用接口指针里面方法,方法具体实现逻辑由该接口的派生类实现.示意图:被调用方 B调用方 A接口指针
4、虚类接口派生类2.4.2 基于事件驱动的数据处理模型为系统功能设计,需要处理网络事件数据SocketEvent,数据库事件数据DatabaseEvent,定时器事件数据TimerEvent等,为此建立数据队列服务QueueService,为每一队列建立多个子线程QueueServiceThread处理。数据队列服务提供添加事件数据方法AddToQueue,设置数据队列服务钩子SetQueueServiceSink,让数据队列服务钩子QueueServiceSink做具体逻辑事件数据处理。示意图:内部线程Thread处理执行数据队列服务QueueService事件数据输入执行数据队列服务钩子Qu
5、eueServiceSink方法再者,根据网络,数据库等特定功能,构建网络,数据库等管理服务,实现数据队列服务钩子QueueServiceSink方法,调度事件数据执行外部处理接口,外部处理接口具体由二次开发用户实现。示意图:外部处理接口管理服务实现数据队列服务钩子QueueServiceSink方法2.4.3 事件数据设计名称描述类型定时器事件TimerEvent根据时间间隔,定期产生自发,被动数据库事件DatabaseEvent请求访问数据库用户自定义,主动网络应答事件SocketAcceptEvent客户端连接网络服务,成功连接自发,被动网络读取事件SocketReadEvent客户端发
6、送数据,网络服务成功读取自发,被动网络关闭事件SocketControlEvent客户端失去连接自发,被动控制事件ControlEvent用户自定义控制服务用户自定义,主动2.4.4 框架体系设计外部 实现内部 服务引擎ServiceEngine调度引擎AttemperEngine网络引擎TCPSocketEngine数据库引擎DataBaseEngine定时器引擎TimerEngine 调度引擎钩子AttemperEngineSink 数据库引擎钩子DataBaseSink异步引擎TimerEngine 异步引擎钩子DataBaseSink2.5 功能模块划分名称描述开发优先数据队列服务Qu
7、eueService外部接受输入事件数据,内部实现事件数据链表保存与管理, 处理子线程从链表获取事件数据调用数据队列钩子方法处理事件数据1网络引擎TCPSocketEngine实现数据队列服务钩子方法,管理网络事件数据,内部启动网络服务器监听服务,接收与发送网络数据,并调用网络处理钩子进行逻辑处理2数据库引擎DataBaseEngine实现数据队列服务钩子方法,管理数据库事件数据,并调用数据库处理钩子进行逻辑处理,还提供数据库访问的帮助类2定时器引擎TimerEngine实现设置定时,删除定时请求,发生定时事件2调度引擎AttemperEngine接收,调度与管理网络事件数据,数据库事件数据,
8、定时器事件数据,自定义调度事件数据2异步引擎AsynchronismEngine设置多个数据处理钩子,异步接收请求并处理2服务引擎ServiceEngine管理网络引擎,数据库引擎,定时器引擎,调度引擎,异步引擎33 模块详细设计3.1 数据队列服务QueueService模块设计3.1.1 基本设计概念建立一个内存链表,保存事件数据,对外部提供方法往链表添加事件数据并通知线程,同时启动多个处理线程,从数据链表里获取事件数据,执行外部钩子方法进行处理.线程事件通知采用完成端口技术.3.1.2 类与接口设计l 接口设计IQueueServiceEngine队列引擎接口模块QueueService
9、继承IQueueServiceEngine IUnknownEx实现数据成员名称说明方法virtual bool _cdecl StartService(BYTE cbThreadCount)说明开始服务参数BYTE cbThreadCount 处理事件数据的线程数量返回类型为Bool,启动成功返回true,否则false举例virtual bool _cdecl StopService()说明停止服务参数返回类型为Bool,启动成功返回true,否则false举例virtual bool _cdecl SetQueueServiceSink(IUnknownEx * pIUnknownEx)
10、说明设置接口外部事件处理钩子参数IUnknownEx * pIUnknownEx 外部事件数据处理钩子返回类型为Bool,设置成功返回true,否则false举例virtual bool _cdecl GetBurthenInfo(tagBurthenInfo & BurthenInfo)说明获取数据队列负荷信息参数tagBurthenInfo & BurthenInfo 负荷信息结构体返回类型为Bool,设置成功返回true,否则false举例IQueueServiceSink队列服务钩子,由外部继层实现模块QueueService继承IQueueServiceSink IUnknownEx
11、实现数据成员名称说明方法virtual void _cdecl OnQueueServiceSink(BYTE cbThreadIndex,WORD wIdentifier, void * pBuffer, WORD wDataSize, DWORD dwInsertTime)说明通知回调函数参数BYTE cbThreadIndex 处理事件数据的线程索引WORD wIdentifier 事件数据标记void * pBuffer 数据指针WORD wDataSize 数据大小DWORD dwInsertTime 插入时间值返回举例l 类设计CQueueServiceThread队列处理线程类模
12、块QueueService继承CQueueServiceThread CServiceThread实现数据成员名称说明HANDLEm_hCompletionPort完成端口句柄BYTE m_cbThreadIndex线程索引BYTE m_cbBufferMAX_QUEUE_PACKET事件接收缓冲方法bool InitThread(HANDLE hCompletionPort,BYTE cbThreadIndex)说明配置参数HANDLE hCompletionPort 完成端口句柄BYTE cbThreadIndex 线程索引返回类型为Bool,设置成功返回true,否则false举例boo
13、l UnInitThread()说明取消配置参数返回类型为Bool,设置成功返回true,否则false举例virtual bool RepetitionRun()说明线程运行函数参数返回类型为Bool举例CQueueService队列服务类模块QueueService继承CQueueService IQueueServiceEngine, IQueueService实现IQueueServiceEngine, IQueueService数据成员名称说明boolm_bService服务标志IQueueServiceSink * m_pIQueueServiceSink回调钩子接口CThread
14、Lockm_ThreadLock线程锁CDataStoragem_DataStorage数据存储CQueueServiceThread*m_QueueServiceThread队列线程HANDLE*m_hCompletionPort 完成端口指针BYTEm_cbThreadCount 线程处理数目方法virtual bool _cdecl AddToQueue(WORD wIdentifier, void * const pBuffer, WORD wDataSize)说明添加事件数据参数WORD wIdentifier 事件数据标记void * const pBuffer 事件数据指针WOR
15、D wDataSize 事件数据大小返回类型为Bool,添加成功返回true,否则false举例virtual bool _cdecl StartService(BYTE cbThreadCount)说明开始服务参数BYTE cbThreadCount 线程数量返回类型为Bool,开始成功返回true,否则false举例virtual bool _cdecl StopService()说明停止服务参数返回类型为Bool, 停止成功返回true,否则false举例virtual bool _cdecl SetQueueServiceSink(IUnknownEx * pIUnknownEx)说明
16、设置接口外部事件处理钩子参数IUnknownEx * pIUnknownEx 外部事件数据处理钩子返回类型为Bool,设置成功返回true,否则false举例virtual bool _cdecl GetBurthenInfo(tagBurthenInfo & BurthenInfo)说明获取数据队列负荷信息参数tagBurthenInfo & BurthenInfo 负荷信息结构体返回类型为Bool,设置成功返回true,否则false举例bool GetData(tagDataHead & DataHead, void * pBuffer, WORD wBufferSize)说明获取事件数
17、据参数tagDataHead & DataHead 事件数据头void * pBuffer 数据指针WORD wBufferSize 数据大小返回类型为Bool,获取成功返回true,否则false举例void OnQueueServiceThread(BYTE cbThreadIndex, const tagDataHead & DataHead, void * pBuffer, WORD wDataSize)说明事件消息,主要由队列线程调用参数BYTE cbThreadIndex 线程索引tagDataHead & DataHead 事件数据头void * pBuffer 数据指针WORD
18、 wBufferSize 数据大小返回举例l 类继承图队列类引擎接口IQueueServiceEngine数据队列接口IQueueService数据队列类CQueueService线程对象类CServiceThread队列线程类CQueueServiceThread3.3.1 运行流程开始服务StartService停止服务StopService加入数据AddToQueue设置钩子接口SetQueueServiceSink保存数据 AddData随机通知线程处理PostQueuedCompletionStatus处理线程CQueueServiceThread运行 RepetitionRun等待
19、完成端口事件GetQueuedCompletionStatus获取数据GetData调用外部钩子方法处理OnQueueServiceSink3.2 网络引擎TCPSocketEngine模块设计3.2.1 网络重叠完成端口IOCP简介完成端口:是一个FIFO队列,操作系统的IO子系统在IO操作完成后,会把相应的IO packet放入该队列。-等待者线程队列:通过调用GetQueuedCompletionStatus API,在完成端口上等待取下一个IO packet。执行者线程组:已经从完成端口上获得IO packet,在占用CPU进行处理。除了以上三种类型的参与者。我们还应该注意两个关联关系
20、,即:IO Handle与完成端口相关联:任何期望使用IOCP的方式来处理IO请求的,必须将相应的IO Handle与该完成端口相关联。需要指出的时,这里的IO Handle,可以是File的Handle,或者是Socket的Handle。-线程与完成端口相关联:任何调用GetQueuedCompletionStatus API的线程,都将与该完成端口相关联。在任何给定的时候,该线程只能与一个完成端口相关联,与最后一次调用的GetQueuedCompletionStatus为准.对于网络重叠完成端口体系示意图如下:操作系统线程用户工作线程Accept网络监听接收绑定socket句柄Create
21、IoCompletionPort(socket句柄,)完成端口m_hCompletionPortWSARecv 请求读取数据WSASend 请求发送数据操作系统的IO子系统处理请求GetQueuedCompletionStatus 判断完成端口状态操作线程WSARecv, WSASend请求处理完毕执行逻辑处理,例如再次WSARecv请求等网络重叠完成端口使用示意图如下:创建完成端口m_hCompletionPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,SystemInfo.dwNumberOfProcessors);绑定
22、socket句柄CreateIoCompletionPort(HANDLE)hConnectSocket,m_hCompletionPort,(ULONG_PTR)pServerSocketItem,0);关闭完成端口CloseHandle(m_hCompletionPort);3.2.2 基本设计概念建立数据队列服务QueueService,对外部输入的对socket的发送,关闭请求等处理。同时建立工作线程SocketAcceptThread做应答Socket,建立读写工作线程ServerSocketRSThread判断完成端口状态,等待系统线程处理读写操作完成,如果完成读操作,发送调度事件
23、到调度引擎处理,并继续投递读操作,如果完成发送操作,判断还有发送请求就继续投递发送请求。最后建立检测工作线程,发送心跳包,检测断线socket连接。l 数据设计与管理先设计客户端连接项ServerSocketItem,实现对客户端连接Socket的发送,接收数据,加密/解密网络包,关闭等操作再设计网络引擎TCPSocketEngine,对客户端连接项的管理,同时接收外部的输入操作请求,还有对应答线程,读写线程,检测线程管理设计应答线程,读写线程,检测线程的功能进行封装,还有重叠数据的帮助封装。l 工作线程运行设计读写线程ServerSocketRSThread判断完成端口状态,内部线程Thre
24、ad处理执行数据队列服务QueueService外部发送请求SendData关闭请求CloseSocket等执行数据队列服务钩子QueueServiceSink方法该钩子IQueueServiceSink由网络引擎管理类TCPSocketEngine继承实现QUEUE_SEND_REQUEST 发送请求QUEUE_SAFE_CLOSE关闭请求QUEUE_ALLOW_BATCH容许群发QUEUE_DETECT_SOCKET 检测连接检测线程SocketDetectThread客户端连接项CServerSocketItem处理请求应答线程SocketAcceptThread应答,生成客户端连接项3
25、.2.3 网络数据命令包结构设计网络数据包分两个区域:包头,用户数据包头:每个网络包都带的数据区域,装载数据包结构信息与数据包命令信息用户数据:根据命令信息不一样,用户自定义的负载数据具体结构如下:网络命令包CMD_Head 数据包传递包头CMD_Info 数据包结构信息具体字段:WORDwDataSize;/数据大小BYTEcbCheckCode;/效验字段BYTEcbMessageVer;/版本标识CMD_Command 数据包命令信息具体字段:WORDwMainCmdID;/ 主命令码WORDwSubCmdID;/ 子命令码CMD_Data 用户命令数据3.2.4 网络数据加密设计数据加
26、密部分为CMD_Command 数据包命令信息 与 CMD_Data 用户命令数据, CMD_Info 数据包结构信息不加密.加密算法为根据字节影射表,将字节替换。例如数据包第6个字节是0x90,通过字节影射表查找,对应的是0x1d,则该字节替换为0x1d发送.3.2.5 类与接口设计l 接口设计请查阅 头文件l 类设计请查阅 头文件l 类继承图重叠结构类COverLapped重叠结构模板类CATLOverLapped服务线程类CServiceThread读写线程类CServerSocketRSThreadTCP SOCKET 引擎接口ITCPSocketEngineTCP SOCKET 引擎
27、管理接口ITCPSocketEngineManager网络引擎类CTCPSocketEngine连接对象回调接口IServerSocketItemSink数据队列类钩子接口IQueueServiceSink服务线程类CServiceThread应答线程类CSocketAcceptThread3.3 数据库引擎DataBaseEngine模块设计3.3.1 基本设计概念数据库引擎建立数据队列服务,接受外部数据库事件数据输入,并调用外部数据库处理钩子方法处理.且提供数据库帮助类对象,实现对数据库访问,数据访问技术采用ADO.3.3.2 类与接口设计l 接口设计IADOError数据库错误接口模块D
28、atabase继承IADOError IUnknownEx实现数据成员名称说明方法virtual LPCTSTR _cdecl GetErrorDescribe()说明获取错误描述参数返回描述错误的文本字符串举例virtual enADOErrorType _cdecl GetErrorType()说明获取错误类型参数返回错误类型的枚举值举例IDataBase数据库连接并访问接口模块Database继承IDataBase IUnknownEx实现数据成员名称说明方法virtual bool _cdecl OpenConnection()说明打开连接参数返回操作成功返回ture,否则flase举
29、例virtual bool _cdecl CloseRecordset()说明关闭记录参数返回操作成功返回ture,否则flase举例virtual bool _cdecl CloseConnection()说明关闭连接参数返回操作成功返回ture,否则flase举例virtual bool _cdecl TryConnectAgain(bool bFocusConnect, CComError * pComError)说明重新连接参数bool bFocusConnect 强制性连接标记CComError * pComError 错误保存返回操作成功返回ture,否则flase举例virtua
30、l bool _cdecl SetConnectionInfo(LPCTSTR szIP, LPCTSTR szPipeName,WORD wPort, LPCTSTR szData, LPCTSTR szName, LPCTSTR szPass)说明设置信息参数LPCTSTR szIP 数据库服务器IP地址LPCTSTR szPipeName 数据库命名实列通道WORD wPort 端口LPCTSTR szData 数据库名称 LPCTSTR szName 访问用户名LPCTSTR szPass 访问密码返回操作成功返回ture,否则flase举例virtual bool _cdecl Is
31、ConnectError()说明判断是否连接错误参数返回操作成功返回ture,否则flase举例virtual bool _cdecl IsRecordsetOpened ()说明判断是否打开记录集参数返回操作成功返回ture,否则flase举例virtual bool _cdecl MoveToNext ()说明往下移动记录游标参数返回操作成功返回ture,否则flase举例virtual bool _cdecl MoveToFirst()说明移到开头参数返回操作成功返回ture,否则flase举例virtual bool _cdecl IsEndRecordset ()说明是否结束参数返回
32、操作成功返回ture,否则flase举例virtual long _cdecl GetRecordCount ()说明获取数目参数返回操作成功返回记录数目举例virtual long _cdecl GetActualSize(LPCTSTR pszParamName)说明获取字段大小参数LPCTSTR pszParamName 参数名称返回操作成功返回字段大小举例virtual long _cdecl BindToRecordset(CADORecordBinding * pBind)说明绑定对象参数CADORecordBinding * pBind 数据库记录绑定对象指针返回操作成功返回0举
33、例virtual long _cdecl NextRecordset ()说明下一记录集参数返回操作成功返回0举例virtual bool _cdecl GetFieldValue ()说明获取记录集的数据参数LPCTSTR lpFieldName 字段名称X & bValue 字段数据值返回操作成功返回true举例virtual void _cdecl SetSPName(LPCTSTR pszSpName)说明获取存储过程名称参数LPCTSTR pszSpName 存储过程名称返回举例virtual void _cdecl AddParamter(LPCTSTR pszName, ADOC
34、G:ParameterDirectionEnum Direction, ADOCG:DataTypeEnum Type, long lSize, _variant_t & vtValue)说明添加参数参数LPCTSTR pszName 字段名称ADOCG:ParameterDirectionEnum Direction 参数输入输出方向标记ADOCG:DataTypeEnum Type 参数类型long lSize 参数大小_variant_t & vtValue 参数值返回举例virtual void _cdecl ClearAllParameters()说明清除参数参数返回举例virtua
35、l void _cdecl GetParameterValue(LPCTSTR pszParamName, _variant_t & vtValue)说明获取参数值参数LPCTSTR pszParamName 参数名称_variant_t & vtValue 参数返回值返回举例virtual long _cdecl GetReturnValue()说明获取数据库返回值参数返回举例virtual bool _cdecl Execute(LPCTSTR pszCommand)说明执行语句参数LPCTSTR pszCommand SQL语句返回操作成功返回ture,否则为false举例virtual
36、 bool _cdecl ExecuteCommand(bool bRecordset)说明执行命令参数bool bRecordset 是否返回记录集返回操作成功返回ture,否则为false举例IDataBaseSink数据库钩子接口模块Database继承IDataBaseSink IUnknownEx实现数据成员名称说明方法virtual bool _cdecl StartService(IUnknownEx * pIUnknownEx)说明数据库模块启动参数IUnknownEx * pIUnknownEx 服务框架接口返回操作成功返回ture,否则false举例virtual bool
37、 _cdecl StopService(IUnknownEx * pIUnknownEx)说明数据库模块关闭参数IUnknownEx * pIUnknownEx 服务框架接口返回操作成功返回ture,否则false举例virtual bool _cdecl OnDataBaseRequest(BYTE cbThreadIndex,const NTY_DataBaseEvent & DataBaseEvent, void * pDataBuffer, WORD wDataSize)说明数据事件操作处理参数BYTE cbThreadIndex 线程索引const NTY_DataBaseEvent
38、 & DataBaseEvent 数据库事件 void * pDataBuffer 数据指针 WORD wDataSize 数据大小返回操作成功返回ture,否则false 举例IDataBaseEngine数据库引擎接口模块Database继承IDataBaseEngine IUnknownEx实现数据成员名称说明方法virtual bool _cdecl StartService(BYTE cbThreadCount)说明启动服务参数BYTE cbThreadCount 数据库线程数量返回操作成功返回ture,否则false举例virtual bool _cdecl StopService
39、()说明停止服务参数返回操作成功返回ture,否则false举例virtual bool _cdecl SetDataBaseSink(IUnknownEx * pIUnknownEx)说明设置数据事件操作处理钩子参数IUnknownEx * pIUnknownEx 钩子指针返回操作成功返回ture,否则false 举例virtual void * _cdecl GetQueueService(const IID & Guid, DWORD dwQueryVer)说明获取接口参数onst IID & Guid 接口标记DWORD dwQueryVer 查询版本返回操作成功返回内存指针,否则Nu
40、ll举例l 类设计CADOError数据库错误类模块Database继承CADOError IADOError IUnknownEx实现IADOError数据成员名称说明enADOErrorTypem_enErrorType错误代号CStringm_strErrorDescribe; 错误信息方法virtual LPCTSTR _cdecl GetErrorDescribe()说明获取错误描述参数返回描述错误的文本字符串举例virtual enADOErrorType _cdecl GetErrorType()说明获取错误类型参数返回错误类型的枚举值举例void SetErrorInfo(enADOErrorType enErrorType, LPCTSTR pszDescribe)说明设置错误参数enADOErrorType enErrorType 错误类型的枚举值LPCTSTR pszDescribe 描述错误的文本字符串返回举例CDataBase数据库连接并访问类模块Database继承CDataBase IDataBase IUnknownEx实现IDataBase数据成员名称说明CADOError m_ADOError; CStringm_strConnect; CStringm_strE