`
sooxin
  • 浏览: 252511 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ACE框架在网络游戏服务器中的设计与应用

阅读更多

陶 道,万旺根
(上海大学 通信与信息工程学院 上海 200072)

随着计算机网络的发展,特别是因特网的出现,数字娱乐和网络游戏产业得到了蓬勃的发展,异军突起的网络游戏成为中国网络产业中的先锋。而由于信息技术的进步,计算机、手机以及不同的传媒终端等不断涌现,如何将这些众多不同的终端通过互联网进行互联互动成为一大技术难点,而这些难点的突破取决于网络游戏服务器的开发。目前在各种服务器通信软件的设计和开发中,已经广泛地使用到软件设计模式。尤其在大型的服务器通信软件开发中常会采用模块化设计。当一个庞大的服务器系统执行任务时,往往要通过其中不同的模块进行协作完成,在这种情况下各机间的数据通信会变得异常繁琐和复杂。另外不同操作系统通信机制的不同也会影响通信软件的开发和效率,网络编程人员通常从底层进行开发,这大大增加了软件开发的难度和周期。针对以上存在的问题,ACE自适应通信构架给出了良好的解决方案,ACE能够跨越多种操作系统平台,可进行通用的网络编程任务,并结合软件设计模式,避免了通信软件根据不同环境需要重新开发的弱点,减少了软件开发的周期和资金,简化和强化了系统的设计实现。

1 ACE框架

ACE自适应通信环境(ADAPTIVE CommunicationEnvironment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步等。ACE体系结构包括3个基本层次:操作系统适配层、C++包装层、框架组件层。操作系统适配层直接驻留在用C写成的本地OS API之上,将ACE中的其他层与OS API相关联的平台专有特性屏蔽开来。由于ACE操作适配层所提供的抽象,极大地增强了ACE的可移植性和可维护性。C++包装层通过提供类型安全的C++接口简化通信应用程序的开发,各种应用可以有选择地继承、聚合或实例化其中的组件来使用这些包装。ACE还包括一个高级的网络编程框架,集成并增强较低层次的C++包装层,该框架支持并发分布式服务动态配置。

大多数的网络化应用可以通过ACE这样的可移植中间件进行开发,因为ACE封装并加强了本地操作系统机制,通过其组件可以移除底层操作系统API的繁琐和易错性创建可重用的网络程序。

2 网络游戏服务器系统框架的设计

在设计网络服务器的过程中,如何保证服务器的安全和最大限度地支持更多的客户端连接是摆在开发者面前一个重要的问题。为了解决这2大问题,根据经验,在开发游戏服务器的过程中,采用如下的服务器架构可有效解决上述2个问题。

2.1 支持Gate的游戏服务器架构

在该架构下,Client和Gate Server相连,而不是直接和Game Server相连。Gate Server主要负责转发客户端和Game Server之间的数据包,Game Server负责处理游戏的所有逻辑。如图1所示。

采用该架构,有如下几个优点:客户端通过Gate Setver和游戏服务器Game Servet相连,Game Server IP对外不可见,这样Game Server更安全、更不易受攻击。一个Game Server同样也可以对应若干个Gate Server,当某个Gate Server受攻击或停机后,其他的Gate Server仍然照常运行,和其他Gate Server相连的客户端仍然可正常进行游戏;可支持更多的客户端连接。Gate Server把众多的客户端连接分散到多个Game Server中去,而不是独自来承担,从而可支持更多的客户端连接;Gate Server可分担一部分安全管理工作,减轻Game Server的压力。例如若某个客户端在一段时间内不发数据包,则把该客户端踢下线的工作可由Gate Server来完成。

2.2 软件功能模块划分

在设计服务器框架时,有一个基本原则,即框架和通信底层的具体实现需要分离,通信底层的具体实现不影响框架代码的修改。因为通信底层的具体实现有很多方式,不同操作系统平台的具体实现差别也很大。例如仅在Windows平台下就有基于Windows消息机制的、基于事件机制的、也有基于完成端口I/O模型的实现等。采用框架与通信底层相分离的原则,也有利于利用一些成熟的开发框架,比如使用的ACE框架。这样,当采用一种新的通信技术实现通信底层时,则可以不改变服务器框架,而只需要修改通信底层。在设计服务器时按照服务器框架与通信底层相分离的原则,将服务器框架设计为多个模块。并生成相应的动态链接库以供调用。软件模块框架如图2所示。

在软件模块划分中,通信底层由线程模块和通信模块组成,上层则由同步、联机管理和兴趣区管理等模块组成。其中同步模块是基于保守/乐观的同步算法构建的服务器同步子系统,客户端方面则可以使用航位推测法减少服务器的发包频率。兴趣区管理模块用于相关性信息过滤,通过订购玩家感兴趣的范围,可以有效减低网络带宽消耗和服务器负载。联机管理模块主要负责数据封包中的通信协议以及数据报的压缩和加密,在数据包中采用加密以增加服务器系统的安全性能,采用压缩以减少网络带宽消耗。

3 服务器系统通信底层的实现

3.1 线程模块的实现

在设计线程模块中使用ACE框架中的ACE_Task类和ACE_Message_Queue来实现主动对象模式,用于处理主动对象,实现多线程处理。传统的对象是被动的代码段,对象中的代码是在对他发出方法调用的线程中执行的,当方法被调用时,调用线程将阻塞,直至调用结束。而主动对象却不一样。这些对象具有自己的命令执行线程,主动对象的方法将在自己的执行线程中执行,不会阻塞调用方法。由于主动对象的方法调用不会阻塞,这样就提高了系统响应速度。

设计中主动对象继承ACE_Task,应用open进行初始化,并派生线程去循环判断方法队列中是否有方法对象,若队列不为空则将方法出队并执行。如图3所示。

在创建任务和主动对象时,从ACE_Task类派生子类,在子类派生之后,采取以下步骤:

(1)实现服务初始化和终止方法:open()方法应该包含所有专属于任务的初始化代码;close()方法则包含相应的终止方法。

(2)调用启用(Activation)方法:在主动对象实例化后,必须通过调用activate()启用他。在主动对象中创建的线程的数目,以及其他一些参数,需传递给activate()方法,activate()方法会使sve()方法成为所有他生成的线程的启动点。

(3)实现服务专有的处理方法;在主动对象被启用后,各个新线程在svc()方法中启动。

并发策略实现的程序流程如图4所示:

3.2 通信模块的实现

3.2.1 反应器ACE Reactor和前摄器ACE Proactor

ACE Reactor(反应器)和Proactor(前摄器)是可扩展的面向对象多路分离器,他们分派应用专有的处理器,以响应多种类型的基于I/O、定时器、信号和同步的事件。

ACE_Reactor反应器应用于同步I/O操作,实现了事件的多路分离与分派,能够处理多个来源的I/O。使用反应器框架,需要执行3个步骤:从ACE_Event_Handler派生一个和多个事件处理器类,并定义相应的事件处理行为;向ACE_Reactor类登记应用的事件处理对象;运行ACE_Reactor事件循环,事件发生时回调事件处理器中的事件处理函数。

ACE_Proactor应用于异步I/O操作,他与反应器不同的是首先等待事件的完成,然后回调完成后的事件处理。当初始化I/O读写后把读写交给系统完成,等待事件完成后前摄器会将执行I/O结果返回给对象,并且回调完成后的事件处理。前摄式模型允许单个应用线程同时发起多个请求。这一设计允许单线程化应用并发的执行多个I/O操作,并且不会带来与传统的多线程化机制相关联的开销或设计复杂性。这样做大大减少了I/O处理时间。

3.2.2 利用前摄器实现高效异步I/O数据通信

在实现通信模块中使用的前摄器模式主要参与者有前摄发起器、完成处理器、异步操作、异步操作处理器、完成分派器。其结构如图5所示:

其中,前摄发起器(服务器应用的主线程)是应用中任何发起异步操作的实体。他将完成处理器和完成分派器登记到异步操作处理器。完成处理器接口用于异步操作完成通知,异步操作则是被用于代表应用执行请求。当异步操作完成时,异步操作处理器将应用通知委托给完成分配器。异步操作是由异步操作处理器来运行直至完成的,该组件通常由操作系统实现。完成分派器负责在异步操作完成时回调应用的完成处理器。当异步操作处理器完成异步发起的操作时,完成分配器代表应用执行应用回调。该机制的实现交互图如图6所示:

3.2.3 通信连接的建立

在具体通信模块中,所用到的ACE主要类有异步连接类、服务处理类、异步操作类和处理结果类。建立连接的过程为:创建异步主动连接和被动连接子类,在进行异步连接时,创建新的服务处理类,并将该服务类传递给异步连接类,这样,数据的传输就交给服务类去执行。实现服务处理子类中提供的挂钩方法,并通过创建ACE_Sock_Stream和异步读写流类来进行异步通信。在异步读写流初始化时将其注册到已创建的proactor中,并保存异步读写流类的句柄。最后数据传送的结果和状态交给处理结果类来处理。异步通信的初始化:

(1)分别创建异步主动连接类的派生类和被动连接类的派生类

class TCommandChannelConnectorAcelmpl:public ACE_Asynch_Connector<TCommandChannelAcelmpl>

class TCommandChannelAcceptorAcelmpI:public ACE_Asynch_Acceptor<TCommandChannelAceImpl>

(2)创建主动连接类对象connector和被动连接类对象acceptor;

(3)对于主动连接,调用connector.open(…),并将其注册到Proactor,由框架自动创建异步通信服务类,并且自动检测连接建立状态;

(4)对于被动连接,调用acceptor.open(…),并将其注册到Proactor,由框架自动创建异步通信服务类,并且自动检测连接建立状态,处于等待侦听状态;

整个异步通信机制实现的流程如图7所示:

3.2.4 ACE_Proactor完成多路分离

ACE_Proactor类负责驱动前摄器框架的完成处理。要让异步I/O完成事件处理得以发生,还需要运行前摄器的事件循环,其流程图如图8所示。

4 结 语

本文设计了一种适用于开发网络游戏的服务器端架构,并应用ACE框架组件和面向对象的设计模式完成服务器底层通信的开发。ACE作为一种免费开源的中间件,富含网络与系统编程的实用设计模式,具有跨平台等优越特性,能够适合任何通信软件的开发。尤其对于网络游戏服务器开发者而言,ACE无疑是一种值得借鉴的通信框架,具有良好的应用前景。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/saly/archive/2009/09/29/4617071.aspx

分享到:
评论

相关推荐

    ACE框架在网络游戏服务器中的设计与应用.pdf

    ACE框架在网络游戏服务器中的设计与应用 论文

    ACE框架在网络游戏服务器中的设计与应用.doc

    ACE框架在网络游戏服务器中的设计与应用

    用ACE网络框架做的一个带有处理线程池的TCP服务器

    这个可是master写的 里面有很多的注释 看起来就不不一样 这个服务器程序还是有多种策略 但是这里面是主要讲带线程池的 是不一个不错的框架应用

    Windows2000 服务器端应用程序开发设计指南

    08-06-13 P2P搜索技术的研究与挑战 08-06-13 P2P的应用研究、面临的问题与前景展望 08-06-13 Peer to Peer ( P2P ) 综述(第二版本) 08-06-13 Windows平台下,完成端口的程序框架 08-06-13 WSAEventSelect网络编程...

    腾讯 ace框架teaf

    腾讯内部大量使用的ace网络通讯框架,TEAF,Tencent Easy ACE ...已经在腾讯互娱(IEG)大部分平台类产品中成熟应用,比如idip,游戏人生,心悦,帮帮,新终端游戏中心aj,cross等,公司其他BG也有很多产品在使用。

    ACE基础学习资料电子版

    002-C++网络编程 卷2 基于ACE和框架的系统化复用 003-ACE程序员指南 004-ACE自适配通信环境中文技术文档 005-ACE开发指南(初级) 从上到下对这次书籍进行阅读,然后同步调试代码,基本是6个月左右就可以掌握一般服务器...

    dslforge:用于Web应用程序和云IDE的领域特定语言(DSL)编辑器的生成器

    DSL伪造 DSL Forge是用于开发针对Web应用程序和云... 从Xtext生成Web编辑器会生成一个插件,该插件将与原始Xtext插件一起打包到工作台应用程序中,从而可以在客户端和服务器之间进行精确的交互。 编辑器功能 在生成的编

    C++标准库介绍.pdf

    以自由使用、开放源代码面向对象框架在其中实现了许多用于并发通信软件Software核心模式ACE提供了组丰 富可复用C包装外观(Wrapper Facade)和框架组件可跨越多种平台完成通用通信软件Software任务其中包括:事 件多路...

    Windows 系统错误代码简单分析

     0317 在 %2 的消息文件中,系统无法找到消息号为 0x%1 的消息文本。  0487 试图访问无效地址。 0534 运算结果超过 32 位。  0535 该管道的另一方有一进程。  0536 等候进程打开管道的另一端。  ...

    ace-boilerplate:具有GraphQL,PostgreSQL和分层架构的Atlas-connect-express应用样板

    在容器中运行堆栈! 基本的Docker编排器 数据库 缓存 -Node.js Web框架 -JavaScript的静态类型检查器 -Atlassian Express图书馆 依赖注入库 -Graphql服务器库 -HTTP隧道服务 快速设置 依存关系 Nodejs v10.x:...

    Edirom-Online:Edirom Online,我们基于Web技术(主要是ExtJS)的演示工具的新版本

    Edirom Online在很大程度上依赖于JavaScript框架ExtJS( ),该框架包含在我们的代码库中。 我们在GPL版本中使用ExtJS 4.2.1。 Edirom Online还包括Raphaëljavscript库( //raphaeljs.com,MIT许可证)和ACE编辑器...

    se3-web-lab3

    se3-web-lab3 基于JavaServer Faces框架开发应用程序,该应用程序检查点是否在坐标平面上的指定区域中。 该应用程序必须包括2个facelets模板-应用程序的开始页面和主页,以及在服务器端实现逻辑的一组托管bean。起始...

    YodPHP 1.4.1.zip

    YodPHP是一个C语言编写的简单的php开发...电脑版切换放置在左侧弹出层中;重命名文件只选中文件名部分;加号菜单优化;iOS设备拍照上传自动重命名文件名;iOS对话框含有iframe时滚动条失效问题优化;桌面开始菜单优化。

    caribbean_medical_mapping:用于存储和浏览医疗设施位置和功能的 Web 应用程序。 最初为几个加勒比国家开发

    #SHOPS 加勒比地图应用程序 一个站点,用于重现加勒比国家卫生部使用的多个或等效 Access 数据库的功能。 系统要求 PHP 5.4 或更高版本 操作系统级 mcrypt 实用程序 PHP5 mcrypt 扩展 MySQL SSH 访问服务器 吉特 ...

    TCK/TK组合教程

    16.2 服务器socket 16.3 回显服务 16.4 用http获取url 16.5 http包 第17章 多解释器和safe-tcl 17.1 interp命令 17.2 创建解释器 17.3 安全解释器 17.4 命令别名 17.5 隐藏命令 17.6 替代 ...

Global site tag (gtag.js) - Google Analytics