陶 道,萬旺根
(上海大學 通訊與資訊工程學院 上海 200072)
隨著計算機網路的發展,特別是網際網路的出現,數字娛樂和網路遊戲產業得到了蓬勃的發展,異軍突起的網路遊戲成為中國網路產業中的先鋒。而由於資訊科技的進步,計算機、手機以及不同的傳媒終端等不斷湧現,如何將這些眾多不同的終端通過網際網路進行互聯互動成為一大技術難點,而這些難點的突破取決於網路遊戲伺服器的開發。目前在各種伺服器通訊軟體的設計和開發中,已經廣泛地使用到軟體設計模式。尤其在大型的伺服器通訊軟體開發中常會採用模組化設計。當乙個龐大的伺服器系統執行任務時,往往要通過其中不同的模組進行協作完成,在這種情況下各機間的資料通訊會變得異常繁瑣和複雜。另外不同作業系統通訊機制的不同也會影響通訊軟體的開發和效率,網路程式設計人員通常從底層進行開發,這大大增加了軟體開發的難度和週期。針對以上存在的問題,ace自適應通訊構架給出了良好的解決方案,ace能夠跨越多種作業系統平台,可進行通用的網路程式設計任務,並結合軟體設計模式,避免了通訊軟體根據不同環境需要重新開發的弱點,減少了軟體開發的週期和資金,簡化和強化了系統的設計實現。
1 ace框架
大多數的網路化應用可以通過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
class tcommandchannelacceptoracelmpi:public ace_asynch_acceptor
(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無疑是一種值得借鑑的通訊框架,具有良好的應用前景。
ACE框架在網路遊戲伺服器中的設計與應用
隨著計算機網路的發展,特別是網際網路的出現,數字娛樂和網路遊戲產業得到了蓬勃的發展,異軍突起的網路遊戲成為中國網路產業中的先鋒。而由於資訊科技的進步,計算機 手機以及不同的傳媒終端等不斷湧現,如何將這些眾多不同的終端通過網際網路進行互聯互動成為一大技術難點,而這些難點的突破取決於網路遊戲伺服器的開發...
網路遊戲 伺服器
using system using system.collections.generic using system.linq using system.text using system.threading.tasks using system.net.sockets using system.n...
《網路遊戲伺服器程式設計》
fd clr s,set removes the descriptor s from set.fd isset s,set nonzero if s is a member of theset.otherwise,zero.fd set s,set adds descriptor s to set....