微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计

题目:微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计

今天向大家介绍一下游戏服务器的设计,着重讲解一下微信房卡麻将棋牌架设(aqiulian。com)的服务器搭建,如果有什么不懂得可以咨询我Q_212303635,欢迎大家的咨询。那么我们开始进去主题吧。

内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口:

图1  IService接口

Start方法用来启动服务。

Stop 方法用来关闭服务。

IsService 方法用于查询当前服务是否正在工作。

内核中的几个Service都不能够直接创建,Applications在使用这些Service的时候首先要得到一个IServiceMgr的实例,这被实现成了一个另类地单例模式。IServiceMgr的接口定义如下:

图2  IServiceMgr接口

IServiceMgr提供两类接口:

1) 获取Service的接口,这样直接得到具体的Service,是因为内核的Service比较固定。没有必要用GetService(strServiceName)这种方法。

GetAsyncService    返回AsyncService的实例

GetDBService        返回DatabaseService的实例

GetTCPService       返回TCPServerService的实例

GetTimerService    返回定时器实例

2) 一个静态的单例方法Instance。它申明在接口层,但是需要在IServiceMgr的实现中去实现它。它返回IServiceMgr的实例。

由于IServiceMgr的实现只是简单地将IAttemptService,ITCPServerServer, IDatabaseService,ITimerService的实现组合在了一起,所以它的实现不会详细描述。

1 AsyncService详细设计

图3  AsyncService的详细设计

AsyncService主要是提供给其他3个Service使用的,它实现了IService接口和IAsyncService接口。因为与异步相关的功能基本上都被boost::asio实现,所以AsyncService主要只是管理boost::asio的实例 。IAsyncService只提供了一个方法:

GetIOService      返回一个可用的boost::asio::io_service的实例

AsyncService组合了boost::asio和ThreadPool,其中boost::asio::io_service的数目和机器的cpu总数相同,而ThreadPool中线程总数为2倍的cpu数。所有ThreadPool中的线程都将作为工作线程,它们的入口函数都是io_service::run。

2 TimerService详细设计

图4  TimerService的结构图

TimerService实现了IService和ITimerService接口。ITimerService提供如下接口:

1) SetTimer(timerId,milisecs,timerFunc,repeatTimes)    设置一个id为timerId的定时器,这个定时器会被激

发repeatTimes次,每两次被小激发的时间间隔为millsecs毫秒。每次被激发都会调用 timerFunc这个函数。

2) KillTimer(timerId)   取消id为timerId的定时器。

3) KillAllTimer()           取消所有的定时器,一般用在系统关闭时调用。

TimerService管理着一些TimerItem,Applications层用一个新的timerId,调用SetTimer时,TimerService就会创建一个新的TimerItem, 而在调用KillTimer时,就会销毁掉与其相关的那个TimerItem。TimerService的实现依赖与AsyncService,因为定时器本质上也是异步操作。将由AsyncService中的io_service来统一调度。

需要注意以下几点:

1) 传给SetTimer的timerFunc这个函数要是线程安全的,因为不确定会在哪个工作线程的context中调用它,同时             如果你的好几个定时器公用同一个timerFunc, 就可能对共享资源造成竞争。

2) SetTimer进如果发现已经存在相同id的TimerItem, 不会创建一个新的TimerItem,而是取消先前的定时器。修            改其参数后启动。

3 TCPServerService详细设计

图5  TCPServerService结构图

TCPServerService实现了IService接口和ITCPServerService接口。ITCPServerService的几个主要接口说明:

1) SendData  通过指定的ISocketItem发送数据, 数据在一般情况下由4个参数: MainCmd, SubCmd, Data, DataSize (可以参与总休设计中关于协议的部分的描述) 。有的时候Data为空,就不需要Data和DataSize这两个参数了。

2) SendDataBatch 给所有连接发送数据。这是批量发送的,所有连接池中对应的客户端都会收到。

3) CloseSocket  关闭指定的连接。

4) SetObserver 设置监听者。用以接收异步通知。

TCPServerService 管理着一个客户端来的连接池。这个连接池由SocketItem组成,每一个SocketItem都与一个整数标识对应,Applications使用这个标识来发送数据和接收数据。SocketItem主要提供下面几个接口:

1) GetIndex    获取与其对应的唯一标识

2) GetRound   由于每个SocketItem都是可以重用的,所以为了防止混乱,比如说一个SocketItem在前一时刻对应着client1, 但是现在对应着client2。client1曾经的一个请求现在才要返回,这时如果没有GetRound就会把client1的处理结果错误地返回给client2。从这里也可以看出,每个SocketItem的round是在连接建立的时候会增加。

3) IsConnected  是否处于连接状态。

4) SendData  发送数据。

5) GetClientAddress 得到客户端的IP地址

6) GetConnectTimer 获取连接时间。

7) Close  关闭连接。

也许你会问了,我怎么只看到发送数据的接口,而没有接收数据的接口呢?因为这是个异步架构,在有连接到来,或者数据到来的时候,你会收到通知的。前提条件是你调用SetObserver设置了监听者。TCPServerService的监听都需要实现ITCPServiceObserver接口, TCPServerService通过这个接口提供的方法来通知你连接和读取事件:

1) OnSocketAccept  在新连接到达时,会调用你这里面的内容。

2) OnSocketRead  在数据读取完成后,会调用你提供的这个方法做进一步处理。

3) OnSocketClose  告诉你连接将要关闭。

需要注意的是如果你这三个方法中有共享的数据,要加锁保护。因为工作线程可能会产生竞争状态。

和TimerService一样,TCPServerService的异步调度依赖于IAsyncService。

4 DatabaseService详细设计

图6  DatabaseService结构图

可以对比一下DatabaseService和TCPServerService的结构图,你会发现他们是那么地相似。对的,它们的设计思路如出一辙。DatabaseService实现了IService和IDatabaseService这两个接口。IDatabaseService主要只提供了3个接口:

1) Connect  连接到一个数据库

2) Query   进行查询。 这里有两点要注意:1) Query以后不会立马得到结果,因为这是异步的; 2) 存储过程的调用也得使用这个方法,你只要将query语句写成 ‘select stroage_procedure(param1,param2,...)‘ 就行了。

3) SetObserver 设置观察者。因为查询是异步的,所以你要设一个观察者来得到通知。

DatabaseService管理着一些数据库连接DBConnect, 每一个DBConnect也与一个整数标识相关联,可以通过GetIndex获得。同时你可以通过IsConnect来查询这个DBConnect是否处于连接状态。

在实现IDBServiceObserver时,你需要实现下面两个方法:

1) OnDBConnect  在数据库连接建立时会调用

2) OnQueryEnd  在这里你可以得到一个表示查询结果的QueryResult对象。你可以通过它知道查询的状态,以及结果信息。

未完。。。待续。

原文地址:https://www.cnblogs.com/phpdemo/p/8421636.html

时间: 2024-08-05 07:09:33

微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计的相关文章

MySQL微信房卡麻将棋牌源码全套实现原理

在MyS微信房卡麻将棋牌源码全套( h5.super-mans.com Q:2012035031)微信房卡麻将棋牌源码全套的事务隔离级别. 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏读.幻读.不可重复读问题.(基本没用) 读已提交:一个事务只能读取另一个事务已经提交的修改.其避免了脏读,但仍然存在不可重复读和幻读问题. 可重复读:同一个事务中多次读取相同的数据返回的结果是一样的.其避免了脏读和不可重复读问题,但幻读依然存在. 串行化:事务串行执行.避免了以上所有问题. 以上是

Cocos2d-x山西推倒胡+扣点房卡麻将下载架设教程

1.数据库还原修改后台数据库jeefwtwo 表:sys_user8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 密码(123456)修改游戏数据库 QPPlatformDB表:DataBaseInfo  SQL的地址端口账号密码表:GameRoomInfo  修改服务器的机器标示 PS,搭建的源码必须完整,本文测试源码来自 Cocos2d-x山西推倒胡+扣点房卡麻将maliwl.com 2.执行脚本每个脚本都要执

微信房卡模式棋牌游戏开发的关键环节

房卡棋牌游戏近来非常火爆,房卡棋牌运营商大获其利,开发房卡棋牌游戏的开发商也赚盆满. 但是,同行不同利:有些房卡棋牌运营商亏损,有些开发商也是举步维艰. 这是什么原因造成的呢? 究其原因,不在于棋牌本身的产品功能,而是在于这些房卡棋牌没有抓到房卡游戏的关键点,即房卡游戏与其运营平台微信未能无缝整合,造成了其在微信中"拉人"的效率低下,用户发展效率低,市场推广就无可置疑地困难. 要想解决这个问题,应当要让自己的棋牌App在微信中如鱼得水才可以.这个如鱼得水包括两个方面,一是拉未安装App

如何编写轻量级微信房卡斗牛棋牌平台出售 CSS 框架

本文酝酿了半年,.有很多话要说,但是没有办法谈论它们.托德嗯,轻量级框架如雨后春笋般涌现.我认为每个人都应该总结他们工作中的共同需求,并编写一个适合他们的CSS框架.在以前的文章中,我提到了面向对象的CSS(如BEM.OOCSS.SMACSS).但是主要是类命名的策略.仍然有很多人对前端框架有肤浅的了解,Bootstrap是后端人员专用的,前端是不必要的等等.我不知道这是从哪里来的,我不喜欢使用框架.起初,也许正如许多人所想的那样,害怕新知识,无法管理,不能解决问题等等.最重要的是,许多人认为框

Java游戏服务器微信房卡炸金花平台出租成长之路

Java游戏服务器成长的微信房卡炸金花平台出租QQ1279829431(h5.mostsheng.com)17061863554源码出售平台出租系列,已经很长时间没写了,不是不想写,而是这一年,基本都是在忙别的了,今天特地挤出时间,对我的2016年,做一个不留遗憾的总结. 2016的事件 不知不觉,又到了春节抢票的时候了,这两天除了盼着年终能发点奖金以外,就是盼着能买一张合适的火车票,今年是离家最久的一年,幸运的是,我成都的小房子要结房了,必须要我本人到场,这就能给我一个理由多请一周的假提前回去

房卡麻将分析之"一键入局"

地方棋牌,VR,AR技术,请关注公众号:"红孩儿的游戏开发之路". 房卡麻将分析之"一键入局" 房卡麻将通过微信邀请好友加入房间进行游戏,大大方便了玩家进行麻将游戏.这也凸显了微信对于游戏引流导量的强大平台作用.本次我们就给大家讲一下"一键入局"的技术原理. 首先,我们先来疏理一下整个过程: 玩家打开游戏,创建房间,并将房间信息(房间说明和房间号码)生成链接通过微信SDK的分享到好友或朋友圈.其它玩家看到这个链接并点击后,如果已经安装游戏,会提示

H5麻将棋牌架设

H5麻将棋牌架设Q2747044651 1.基于h5.zhengtuwl.com+MYSQL的技术,成熟的技术方案,高效稳定,且方便Windows开发,Linux平台布署,节约服务器运转成本 2.基于最新版本的cocos引擎,cocos creator开发,可快速的进行界面调整.且能够快速地发布iOS,Android版本.3.如需H5版本,只需针对H5平台进行资源优化即可.4.以闲来游戏-H5麻将作为参考. 成熟可靠的房卡式设计,能满足大部分用户使用体验. 5.包含血战到底,血流成河玩法 5.产

房卡麻将分析系列 "牌局回放" 之 播放处理

持续放出房卡麻将设计与研发讲解.敬请关注微信共众号:红孩儿的游戏开发之路 房卡麻将分析系列 "牌局回放" 之 播放处理 昨天红孩儿给大伙讲了讲"牌局回放"的数据记录处理,有了数据的存储,下面就是数据的显示了. 实话讲,好久没用过 SQL Server 来做数据库了, 网狐的服务器是基于WIN,IOCP,  SQL Server 这套路子.配置好后,可以在QPTreasureDB数据库中看到三个牌局相关的表. 其中dbo.PrivateGameRecord是存储当前游

房卡麻将分析系列之"发牌器"算法设计

大家好,经过一段时间的努力,在填平了大部分源码框架中的坑后,我们的"大赢家"红中麻将总算完成了1.0版本,虽然仍然有诸多问题,但总归算是有一个好的开始,希望后续诸事顺利,能够早日跑出流水,也欢迎各位合作商积极与我联系. 回顾开发过程,我深深的体会到,一个有多年摸牌经验的服务器主程是有多么重要!记得年前帮一家公司做房卡麻将项目,对方从上到下,基本没人会玩麻将,诸事都需要请教麻友,这样的情况我觉得上线的产品应该也不太会好吧,没爱的设计~!不过我可是8岁就上牌桌,八十年代家里就有了一幅竹制麻