- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
369棋牌游戏网络通信架构说明2ndEdition2012-11-2
369棋牌游戏网络通信架构说明
369棋牌游戏的总体设计思路是 先设计了一个游戏框架作为游戏内核,向外暴露出接口,供游戏逻辑部分调用。
这个框架分为两部分:服务器端框架和客户端框架。下面分别描述:
服务器端框架 这部分编译好以后是一个kernelEngine.dll。这个dll向外暴露出几个Service接口。游戏的服务器端启动时,主要就是调用这几个Service接口的start()方法。先大致列举一下有哪几个Service,如下图所示:
下面那个队列服务,是不对外暴露的。它是供上面那几个引擎(也即Service)做请求排队用的。因为一个引擎,比如网络引擎,可能提交给它处理的请求同时有多个,这样就需要先放入一个队列里面。
队列服务的实现:
这个队列本身是做成一个服务的,启动该服务,会跑一个线程。该线程就是一直查询队列里的数据,发现有请求数据就调用服务的一个方法。而服务的这个方法会调用一个回调接口的方法。引擎如果要用到队列服务,就实现这个回调接口,然后初始化时把自己的指针传给队列服务。
网络引擎 启动时主要做了这几个工作:
1.因为要处理多个排队请求,它实现了队列服务的回调接口,把自己的指针传给了一个“发送队列服务”对象。
2.建立了一个IO完成端口。(IO完成端口主要就是windowsAPI的一个机制,其他平台估计也有类似机制。它主要就是把一个线程和IO操作状态关联起来。当一个IO操作完成时,windows系统把一个操作完成包放到一个队列里,和此IO完成端口关联的线程会调用一个windows API,读取该队列的操作完成包,拿到该包后,就可以根据包数据作些操作。如果队列里没有完成包,线程会挂在那里等待。)
3.这里建立的IO完成端口依次和ServerSocket也就是监听套接字,Accept进来的每一个通信Socket绑定。这样每次通过这个Socket读入数据还是写出数据,都能接收到IO完成端口的通知。以上这个绑定操作,是在一个名叫CsocketAcceptThread的“接收”线程里做的。现在网络引擎启动时,把这个线程启动了。
4.作为IO完成端口队列的消费者,还需要一个线程去拿到队列里的完成通知包。然后根据通知包,做一些操作。于是引擎也启动了这个线程。这个线程内部是这样的,它检测到这是一个读操作完成,就调用网络引擎的一个OnSocketReadEvent方法。这个SocketReadEvent方法会把一个EVENT_SOCKET_READ预定义的常数操作码,和数据buffer添加到调度引擎的操作队列里(就是用那个队列服务实现)。调度引擎里有一个switch…case结构,区分了几大类操作。其中有一类就是EVENT_SOCKET_READ(其他还有数据库操作的标识)。这个switch…case正好是放在调度引擎的队列服务的回调接口里的,供队列服务的线程调用。
网络引擎还有SendData方法,这主要就是把操作请求加到“发送”队列服务里。队列服务再调用引擎的回调方法。回调方法里就是用Accept来的保存起来的Socket发送数据。
调度引擎 该引擎就是接收其他引擎加到它的队列服务里来的操作请求数据,并进行处理。处理时呢,又向外面暴露出一个回调接口(钩子)。这个回调接口不由调度引擎自己实现,靠启动引擎时,由包装引擎的应用程序,比如游戏服务模块,传入一个实现。
游戏服务模块的这个实现就是CattemperEngineSink这个类。类里的这个OnEventTCPNetworkRead方法被调度引擎调用。这个方法也是一个switch…Case结构。该结构内有这么一段:
case MDM_GF_GAME: //游戏消息
{
return OnSocketMainGame(Command.wSubCmdID,pData,wDataSize,dwSocketID);
}而处理客户端发来的消息,是委托给一个回调接口的。该回调接口由具体游戏比如:牛牛 来实现,名字叫CtableFrameSink的这个类。
这个类的OnGameMessage用了一个switch…case结构处理各种客户端发来的游戏消息。根据各类消息,结合GameLogic类进行处理。
客户端框架 客户端的网络通信也有一个框架。该框架相对简单,连接是在connect()方法里作的。连接后把socket句柄保存在成员变量里。然后建立了一个隐形的窗口,把socket和这个窗口关联起来。
用到了一个windowsAPI:WSAAsyncSelect。该API使得每当Socket的状态发生变化时,就会发送一个自定义的窗口消息给那个隐形的关联窗口。根据windows的消息循环机制,由窗口关联的过程来处理这个消息--又是一个switch…case 结构,对消息进行了分类:连接
您可能关注的文档
最近下载
- 第4课 科技力量大 第1课时(课件)2025道德与法治三年级上册统编版.pptx
- 急!错误号—2146827859如何解决&浏览器不能创建xml组件.docx VIP
- 外研版小学英语单词汇总(三年级-六年级).pdf VIP
- 涉企行政检查规范培训.pptx
- 单元语法和配套练习 Unit 4 新版 2025年新外研版八年级上册.pdf
- 川教版(2024)《信息技术》四年级上册 第一单元 第3节 《会讲故事的数据》课件.pptx VIP
- 常用化工设备标准规范.pdf VIP
- 单元语法和配套练习 Unit 3 新版 2025年新外研版八年级上册.pdf
- OTIS奥旳斯ACD5调试手册调试资料DAA29100AD_SUR_ACD5-77.pdf
- 股权转让协议担保.docx VIP
文档评论(0)