在开发支持百万连接的棋牌类游戏中想到的:

来源:互联网 发布:python socket bind 编辑:程序博客网 时间:2024/04/29 04:28

单独开发一个支持百万连接的棋类或者牌类游戏也许不复杂,

其一般都是用IOCP(完成端口)来支持上万级的连接,通过配置支持百万级的长连接。

但是如果要开发可扩展的支持任意的棋牌类游戏服务器框架也许应该是一种挑战。

本人目前致力于这项工作,并且在服务器中实现验证逻辑并将其与网络的传送与分发任务相分离,工作量目前完成60%。发表本文以记录自己在开发中所想到的。

为什么要在服务器中实现验证逻辑:
c/s结构的程序如果其验证逻辑仅仅在客户端,服务器充当一个中转的中介,这样服务器的实现相对而言比较简单。但是服务器中没有了验证逻辑,带来了很多问题,最大的问题在于不能阻止客户端作弊。
服务器实现验证逻辑保证了各个客户端的相对公平性,但是这样带来了服务器实现逻辑上和计算性能上的挑战。本文阐释了本人在实现过程中认为比较重要的几个方面:

1.关于如何确定服务器中的数据结构:
服务器的数据关键特征是插入、删除和查找都是混合在一起的。一般来说,没有办法预测对树的下一个操作是什么。也就是说有可能是进行一些插入,然后一些查找,然后可能再进行一些插入,然后也许一些删除,然后再来一些查找,然后更多的插入或删除,然后更多的查找等。
适用于这种情况的数据结构是优先应当考虑map和multimap了,毕竟他们提供了O(ln(N))的对数时间查找的保证.即使在服务器中维持多个上万的数据记录,其查找仍然是比较快速的。
但是这里有一个比较头痛的问题是:因为服务器是多线程,并且使用了容器,同步的实现显得很复杂。

2.实现了“广播域”和“局”的概念的抽象:
这样网络中的数据只向其逻辑上应该到达的地方传送。也就是说如果数据只在一个房间中发送,那它就只会向房间中的每个人发送。如果数据只应该向局中的用户发送,那它就只会向相同局中的用户发送。这样就避免了数据广播风暴,试想一下如果每台服务器响应上万的连接,每一条连接的数据都用广播的方式传送。这对服务器而言是不可以承受的。

3.实现了最基本的数据在服务器的验证性要求:(也就是“局”逻辑实现,更进一步的逻辑实现可以从该类派生)
客户的数据经过”局“判断合法之后,才可以向相关的用户(同一个局中的用户)转发。对用户的非法数据
比如经过客户端作弊器修改之后的数据,服务器向客户端给出警告提示并作出相应的处理。
从数据到达服务器到其被转发到合法用户的整个处理过程是十分高效和快捷的。时间复杂度为O(ln(N))。
"局“定义:每种游戏均产生一种不同局,比如象棋可以产生象棋局,围棋产生围棋局,斗地主产生斗地主局,桥牌产生桥牌局。

4.实现了网络传送任务和“局”逻辑实现的分离:
这样服务器在不同的“局”可以针对应用本身实现“局”的逻辑,而不用关心服务器的网络传送,分发模型。极大的减轻了服务器二次开发的负担。这种分离是通过模板来实现的。