隨著計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展,特別是因特網(wǎng)的出現(xiàn),數(shù)字娛樂和網(wǎng)絡(luò)游戲產(chǎn)業(yè)得到了蓬勃的發(fā)展,異軍突起的網(wǎng)絡(luò)游戲成為中國網(wǎng)絡(luò)產(chǎn)業(yè)中的先鋒。而由于信息技
術(shù)的進(jìn)步,計(jì)算機(jī)、手機(jī)以及不同的傳媒終端等不斷涌現(xiàn),如何將這些眾多不同的終端通過互聯(lián)網(wǎng)進(jìn)行互聯(lián)互動(dòng)成為一大技術(shù)難點(diǎn),而這些難點(diǎn)的突破取決于網(wǎng)絡(luò)游
戲服務(wù)器的開發(fā)。目前在各種服務(wù)器通信軟件的設(shè)計(jì)和開發(fā)中,已經(jīng)廣泛地使用到軟件設(shè)計(jì)模式。尤其在大型的服務(wù)器通信軟件開發(fā)中常會(huì)采用模塊化設(shè)計(jì)。當(dāng)一個(gè)
龐大的服務(wù)器系統(tǒng)執(zhí)行任務(wù)時(shí),往往要通過其中不同的模塊進(jìn)行協(xié)作完成,在這種情況下各機(jī)間的數(shù)據(jù)通信會(huì)變得異常繁瑣和復(fù)雜。另外不同操作系統(tǒng)通信機(jī)制的不
同也會(huì)影響通信軟件的開發(fā)和效率,網(wǎng)絡(luò)編程人員通常從底層進(jìn)行開發(fā),這大大增加了軟件開發(fā)的難度和周期。針對(duì)以上存在的問題,ACE自適應(yīng)通信構(gòu)架給出了
良好的解決方案,ACE能夠跨越多種操作系統(tǒng)平臺(tái),可進(jìn)行通用的網(wǎng)絡(luò)編程任務(wù),并結(jié)合軟件設(shè)計(jì)模式,避免了通信軟件根據(jù)不同環(huán)境需要重新開發(fā)的弱點(diǎn),減少
了軟件開發(fā)的周期和資金,簡(jiǎn)化和強(qiáng)化了系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)。
1 ACE框架
ACE
自適應(yīng)通信環(huán)境(ADAPTIVE
CommunicationEnvironment)是可以自由使用、開放源碼的面向?qū)ο?OO)框架(Framework),在其中實(shí)現(xiàn)了許多用于并發(fā)
通信軟件的核心模式。ACE提供了一組豐富的可復(fù)用C++Wrapper
Facade(包裝外觀)和框架組件,可跨越多種平臺(tái)完成通用的通信軟件任務(wù),其中包括:事件多路分離和事件處理器分派、信號(hào)處理、服務(wù)初始化、進(jìn)程間通
信、共享內(nèi)存管理、消息路由、分布式服務(wù)動(dòng)態(tài)(重)配置、并發(fā)執(zhí)行和同步等。ACE體系結(jié)構(gòu)包括3個(gè)基本層次:操作系統(tǒng)適配層、C++包裝層、框架組件
層。操作系統(tǒng)適配層直接駐留在用C寫成的本地OS API之上,將ACE中的其他層與OS
API相關(guān)聯(lián)的平臺(tái)專有特性屏蔽開來。由于ACE操作適配層所提供的抽象,極大地增強(qiáng)了ACE的可移植性和可維護(hù)性。C++包裝層通過提供類型安全的
C++接口簡(jiǎn)化通信應(yīng)用程序的開發(fā),各種應(yīng)用可以有選擇地繼承、聚合或?qū)嵗渲械慕M件來使用這些包裝。ACE還包括一個(gè)高級(jí)的網(wǎng)絡(luò)編程框架,集成并增強(qiáng)
較低層次的C++包裝層,該框架支持并發(fā)分布式服務(wù)動(dòng)態(tài)配置。
大多數(shù)的網(wǎng)絡(luò)化應(yīng)用可以通過ACE這樣的可移植中間件進(jìn)行開發(fā),因?yàn)锳CE封裝并加強(qiáng)了本地操作系統(tǒng)機(jī)制,通過其組件可以移除底層操作系統(tǒng)API的繁瑣和易錯(cuò)性創(chuàng)建可重用的網(wǎng)絡(luò)程序。
2 網(wǎng)絡(luò)游戲服務(wù)器系統(tǒng)框架的設(shè)計(jì)
在設(shè)計(jì)網(wǎng)絡(luò)服務(wù)器的過程中,如何保證服務(wù)器的安全和最大限度地支持更多的客戶端連接是擺在開發(fā)者面前一個(gè)重要的問題。為了解決這2大問題,根據(jù)經(jīng)驗(yàn),在開發(fā)游戲服務(wù)器的過程中,采用如下的服務(wù)器架構(gòu)可有效解決上述2個(gè)問題。
2.1 支持Gate的游戲服務(wù)器架構(gòu)
在該架構(gòu)下,Client和Gate Server相連,而不是直接和Game Server相連。Gate Server主要負(fù)責(zé)轉(zhuǎn)發(fā)客戶端和Game Server之間的數(shù)據(jù)包,Game Server負(fù)責(zé)處理游戲的所有邏輯。如圖1所示。
采
用該架構(gòu),有如下幾個(gè)優(yōu)點(diǎn):客戶端通過Gate Setver和游戲服務(wù)器Game Servet相連,Game Server
IP對(duì)外不可見,這樣Game Server更安全、更不易受攻擊。一個(gè)Game Server同樣也可以對(duì)應(yīng)若干個(gè)Gate
Server,當(dāng)某個(gè)Gate Server受攻擊或停機(jī)后,其他的Gate Server仍然照常運(yùn)行,和其他Gate
Server相連的客戶端仍然可正常進(jìn)行游戲;可支持更多的客戶端連接。Gate Server把眾多的客戶端連接分散到多個(gè)Game
Server中去,而不是獨(dú)自來承擔(dān),從而可支持更多的客戶端連接;Gate Server可分擔(dān)一部分安全管理工作,減輕Game
Server的壓力。例如若某個(gè)客戶端在一段時(shí)間內(nèi)不發(fā)數(shù)據(jù)包,則把該客戶端踢下線的工作可由Gate Server來完成。
2.2 軟件功能模塊劃分
在
設(shè)計(jì)服務(wù)器框架時(shí),有一個(gè)基本原則,即框架和通信底層的具體實(shí)現(xiàn)需要分離,通信底層的具體實(shí)現(xiàn)不影響框架代碼的修改。因?yàn)橥ㄐ诺讓拥木唧w實(shí)現(xiàn)有很多方式,
不同操作系統(tǒng)平臺(tái)的具體實(shí)現(xiàn)差別也很大。例如僅在Windows平臺(tái)下就有基于Windows消息機(jī)制的、基于事件機(jī)制的、也有基于完成端口I/O模型的
實(shí)現(xiàn)等。采用框架與通信底層相分離的原則,也有利于利用一些成熟的開發(fā)框架,比如使用的ACE框架。這樣,當(dāng)采用一種新的通信技術(shù)實(shí)現(xiàn)通信底層時(shí),則可以
不改變服務(wù)器框架,而只需要修改通信底層。在設(shè)計(jì)服務(wù)器時(shí)按照服務(wù)器框架與通信底層相分離的原則,將服務(wù)器框架設(shè)計(jì)為多個(gè)模塊。并生成相應(yīng)的動(dòng)態(tài)鏈接庫以
供調(diào)用。軟件模塊框架如圖2所示。
在
軟件模塊劃分中,通信底層由線程模塊和通信模塊組成,上層則由同步、聯(lián)機(jī)管理和興趣區(qū)管理等模塊組成。其中同步模塊是基于保守/樂觀的同步算法構(gòu)建的服務(wù)
器同步子系統(tǒng),客戶端方面則可以使用航位推測(cè)法減少服務(wù)器的發(fā)包頻率。興趣區(qū)管理模塊用于相關(guān)性信息過濾,通過訂購?fù)婕腋信d趣的范圍,可以有效減低網(wǎng)絡(luò)帶
寬消耗和服務(wù)器負(fù)載。聯(lián)機(jī)管理模塊主要負(fù)責(zé)數(shù)據(jù)封包中的通信協(xié)議以及數(shù)據(jù)報(bào)的壓縮和加密,在數(shù)據(jù)包中采用加密以增加服務(wù)器系統(tǒng)的安全性能,采用壓縮以減少
網(wǎng)絡(luò)帶寬消耗。
3 服務(wù)器系統(tǒng)通信底層的實(shí)現(xiàn)
3.1 線程模塊的實(shí)現(xiàn)
在
設(shè)計(jì)線程模塊中使用ACE框架中的ACE_Task類和ACE_Message_Queue來實(shí)現(xiàn)主動(dòng)對(duì)象模式,用于處理主動(dòng)對(duì)象,實(shí)現(xiàn)多線程處理。傳統(tǒng)
的對(duì)象是被動(dòng)的代碼段,對(duì)象中的代碼是在對(duì)他發(fā)出方法調(diào)用的線程中執(zhí)行的,當(dāng)方法被調(diào)用時(shí),調(diào)用線程將阻塞,直至調(diào)用結(jié)束。而主動(dòng)對(duì)象卻不一樣。這些對(duì)象
具有自己的命令執(zhí)行線程,主動(dòng)對(duì)象的方法將在自己的執(zhí)行線程中執(zhí)行,不會(huì)阻塞調(diào)用方法。由于主動(dòng)對(duì)象的方法調(diào)用不會(huì)阻塞,這樣就提高了系統(tǒng)響應(yīng)速度。
設(shè)計(jì)中主動(dòng)對(duì)象繼承ACE_Task,應(yīng)用open進(jìn)行初始化,并派生線程去循環(huán)判斷方法隊(duì)列中是否有方法對(duì)象,若隊(duì)列不為空則將方法出隊(duì)并執(zhí)行。如圖3所示。
在創(chuàng)建任務(wù)和主動(dòng)對(duì)象時(shí),從ACE_Task類派生子類,在子類派生之后,采取以下步驟:
(1)實(shí)現(xiàn)服務(wù)初始化和終止方法:open()方法應(yīng)該包含所有專屬于任務(wù)的初始化代碼;close()方法則包含相應(yīng)的終止方法。
(2)
調(diào)用啟用(Activation)方法:在主動(dòng)對(duì)象實(shí)例化后,必須通過調(diào)用activate()啟用他。在主動(dòng)對(duì)象中創(chuàng)建的線程的數(shù)目,以及其他一些參
數(shù),需傳遞給activate()方法,activate()方法會(huì)使sve()方法成為所有他生成的線程的啟動(dòng)點(diǎn)。
(3)實(shí)現(xiàn)服務(wù)專有的處理方法;在主動(dòng)對(duì)象被啟用后,各個(gè)新線程在svc()方法中啟動(dòng)。
并發(fā)策略實(shí)現(xiàn)的程序流程如圖4所示:
3.2 通信模塊的實(shí)現(xiàn)
3.2.1 反應(yīng)器ACE Reactor和前攝器ACE Proactor
ACE Reactor(反應(yīng)器)和Proactor(前攝器)是可擴(kuò)展的面向?qū)ο蠖嗦贩蛛x器,他們分派應(yīng)用專有的處理器,以響應(yīng)多種類型的基于I/O、定時(shí)器、信號(hào)和同步的事件。
ACE_Reactor
反應(yīng)器應(yīng)用于同步I/O操作,實(shí)現(xiàn)了事件的多路分離與分派,能夠處理多個(gè)來源的I/O。使用反應(yīng)器框架,需要執(zhí)行3個(gè)步驟:從
ACE_Event_Handler派生一個(gè)和多個(gè)事件處理器類,并定義相應(yīng)的事件處理行為;向ACE_Reactor類登記應(yīng)用的事件處理對(duì)象;運(yùn)行
ACE_Reactor事件循環(huán),事件發(fā)生時(shí)回調(diào)事件處理器中的事件處理函數(shù)。
ACE_Proactor應(yīng)用
于異步I/O操作,他與反應(yīng)器不同的是首先等待事件的完成,然后回調(diào)完成后的事件處理。當(dāng)初始化I/O讀寫后把讀寫交給系統(tǒng)完成,等待事件完成后前攝器會(huì)
將執(zhí)行I/O結(jié)果返回給對(duì)象,并且回調(diào)完成后的事件處理。前攝式模型允許單個(gè)應(yīng)用線程同時(shí)發(fā)起多個(gè)請(qǐng)求。這一設(shè)計(jì)允許單線程化應(yīng)用并發(fā)的執(zhí)行多個(gè)I/O操
作,并且不會(huì)帶來與傳統(tǒng)的多線程化機(jī)制相關(guān)聯(lián)的開銷或設(shè)計(jì)復(fù)雜性。這樣做大大減少了I/O處理時(shí)間。
3.2.2 利用前攝器實(shí)現(xiàn)高效異步I/O數(shù)據(jù)通信
在實(shí)現(xiàn)通信模塊中使用的前攝器模式主要參與者有前攝發(fā)起器、完成處理器、異步操作、異步操作處理器、完成分派器。其結(jié)構(gòu)如圖5所示:
其中,前攝發(fā)起器(服務(wù)器應(yīng)用的主線程)是應(yīng)用中任何發(fā)起異步操作的實(shí)體。他將完成處理器和完成分派器登記到異步操作處理器。完成處理器接口用于異步操作
完成通知,異步操作則是被用于代表應(yīng)用執(zhí)行請(qǐng)求。當(dāng)異步操作完成時(shí),異步操作處理器將應(yīng)用通知委托給完成分配器。異步操作是由異步操作處理器來運(yùn)行直至完
成的,該組件通常由操作系統(tǒng)實(shí)現(xiàn)。完成分派器負(fù)責(zé)在異步操作完成時(shí)回調(diào)應(yīng)用的完成處理器。當(dāng)異步操作處理器完成異步發(fā)起的操作時(shí),完成分配器代表應(yīng)用執(zhí)行
應(yīng)用回調(diào)。該機(jī)制的實(shí)現(xiàn)交互圖如圖6所示:
3.2.3 通信連接的建立
在
具體通信模塊中,所用到的ACE主要類有異步連接類、服務(wù)處理類、異步操作類和處理結(jié)果類。建立連接的過程為:創(chuàng)建異步主動(dòng)連接和被動(dòng)連接子類,在進(jìn)行異
步連接時(shí),創(chuàng)建新的服務(wù)處理類,并將該服務(wù)類傳遞給異步連接類,這樣,數(shù)據(jù)的傳輸就交給服務(wù)類去執(zhí)行。實(shí)現(xiàn)服務(wù)處理子類中提供的掛鉤方法,并通過創(chuàng)建
ACE_Sock_Stream和異步讀寫流類來進(jìn)行異步通信。在異步讀寫流初始化時(shí)將其注冊(cè)到已創(chuàng)建的proactor中,并保存異步讀寫流類的句柄。
最后數(shù)據(jù)傳送的結(jié)果和狀態(tài)交給處理結(jié)果類來處理。異步通信的初始化:
(1)分別創(chuàng)建異步主動(dòng)連接類的派生類和被動(dòng)連接類的派生類
class TCommandChannelConnectorAcelmpl:public ACE_Asynch_Connector<TCommandChannelAcelmpl>
class TCommandChannelAcceptorAcelmpI:public ACE_Asynch_Acceptor<TCommandChannelAceImpl>
(2)創(chuàng)建主動(dòng)連接類對(duì)象connector和被動(dòng)連接類對(duì)象acceptor;
(3)對(duì)于主動(dòng)連接,調(diào)用connector.open(…),并將其注冊(cè)到Proactor,由框架自動(dòng)創(chuàng)建異步通信服務(wù)類,并且自動(dòng)檢測(cè)連接建立狀態(tài);
(4)對(duì)于被動(dòng)連接,調(diào)用acceptor.open(…),并將其注冊(cè)到Proactor,由框架自動(dòng)創(chuàng)建異步通信服務(wù)類,并且自動(dòng)檢測(cè)連接建立狀態(tài),處于等待偵聽狀態(tài);
整個(gè)異步通信機(jī)制實(shí)現(xiàn)的流程如圖7所示:
3.2.4 ACE_Proactor完成多路分離
ACE_Proactor類負(fù)責(zé)驅(qū)動(dòng)前攝器框架的完成處理。要讓異步I/O完成事件處理得以發(fā)生,還需要運(yùn)行前攝器的事件循環(huán),其流程圖如圖8所示。
4 結(jié) 語
本
文設(shè)計(jì)了一種適用于開發(fā)網(wǎng)絡(luò)游戲的服務(wù)器端架構(gòu),并應(yīng)用ACE框架組件和面向?qū)ο蟮脑O(shè)計(jì)模式完成服務(wù)器底層通信的開發(fā)。ACE作為一種免費(fèi)開源的中間件,
富含網(wǎng)絡(luò)與系統(tǒng)編程的實(shí)用設(shè)計(jì)模式,具有跨平臺(tái)等優(yōu)越特性,能夠適合任何通信軟件的開發(fā)。尤其對(duì)于網(wǎng)絡(luò)游戲服務(wù)器開發(fā)者而言,ACE無疑是一種值得借鑒的
通信框架,具有良好的應(yīng)用前景。