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

时间:2008-12-07   来源:   网友评论:0   人气: 1345 作者:

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

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

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

ic72新闻中心

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

ic72新闻中心

      3.2.3 通信连接的建立

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

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

      class TCommandChannelConnectorAcelmpl:public ACE_Asynch_Connector

      class TCommandChannelAcceptorAcelmpI:public ACE_Asynch_Acceptor

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

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

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

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

ic72新闻中心

      3.2.4 ACE_Proactor完成多路分离

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

ic72新闻中心

      4 结 语

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


 

文章评论