一、物理架構(gòu)說(shuō)明
游戲系統(tǒng)組件包括:
○?服務(wù)器系統(tǒng)(中心服務(wù)器的控制系統(tǒng),服務(wù)器登陸控制的系統(tǒng),游戲登陸服務(wù)器,游戲房間控制的系統(tǒng),游戲組件系統(tǒng)),游戲客戶(hù)端(游戲大廳,游戲組件)。
○?數(shù)據(jù)庫(kù)系統(tǒng):用于保存用戶(hù)的信息數(shù)據(jù)、游戲積分?jǐn)?shù)據(jù)、游戲系統(tǒng)運(yùn)行狀態(tài)的數(shù)據(jù)以及系統(tǒng)日志數(shù)據(jù)等數(shù)據(jù)。
○?中心服務(wù)器的控制系統(tǒng):用于向客戶(hù)端提供全局配置及初始化數(shù)據(jù)使用。
○?服務(wù)器登陸的控制系統(tǒng):用于房間服務(wù)控制系統(tǒng)的登陸效驗(yàn)使用。
○?游戲房間的控制系統(tǒng):用于控制游戲房間的啟動(dòng),停止,添加,刪除,管理等等。
○?游戲組件系統(tǒng):用于具體游戲服務(wù),被游戲房間控制系統(tǒng)掛接,提供游戲服務(wù)。
○?游戲大廳:游戲玩家連接游戲使用。
二、系統(tǒng)結(jié)構(gòu)
系統(tǒng)所選用的開(kāi)發(fā)工具是優(yōu)秀的MicrosoftVisualC++.net2003,系統(tǒng)是采用了客戶(hù)端/服務(wù)器(C/S)編程模式,TCP/IP協(xié)議作為客戶(hù)端與服務(wù)器的通信網(wǎng)絡(luò)層,運(yùn)用了具有性能最優(yōu)的完成端口(IOCP:Input/OutputCompletionPort)網(wǎng)絡(luò)開(kāi)發(fā)模型以搭建服務(wù)器軟件,客戶(hù)端采用WinSocketAPI作為網(wǎng)絡(luò)層。
系統(tǒng)采用了多服務(wù)器分布式的架構(gòu),由一個(gè)中心服務(wù)器CENTERSERVER和多個(gè)主服務(wù)器MainServer以及多個(gè)從服務(wù)器(LocalServer)同時(shí)工作以實(shí)現(xiàn)游戲邏輯和用戶(hù)管理及通訊的功能。中心服務(wù)器向客戶(hù)端提供全局配置,初始化數(shù)據(jù)(主要是定位一個(gè)主服務(wù)器IP地址),主服務(wù)器管理客戶(hù)端用戶(hù)身份驗(yàn)證、登錄以及管理從服務(wù)器的建立,由多個(gè)從服務(wù)器管理游戲通信,大廳及房間,從服務(wù)器可任意添加、刪除、修改等。
系統(tǒng)首先啟動(dòng)中心服務(wù)器(CENTERSERVER),中心服務(wù)器從INI文件中讀取MainServer列表信息,客戶(hù)端提供全局配置,初始化數(shù)據(jù),然后等待客戶(hù)聯(lián)結(jié),客戶(hù)聯(lián)結(jié)后CENTERSERVER定位一個(gè)MainServer的IP地址和端口號(hào),發(fā)往客戶(hù)端,客戶(hù)端收到后斷開(kāi)CENTERSERVER的聯(lián)接,并馬上用MainServer的IP地址和端口號(hào),和主服務(wù)器(MainServer)連接.主服務(wù)器從數(shù)據(jù)庫(kù)中讀取從服務(wù)器的所有信息到主服務(wù)器的內(nèi)存。首先讀取ComType表以建立所有的游戲類(lèi)型的基本信息,然后讀取ServiceInfo(界面樹(shù)結(jié)點(diǎn)信息表)以獲得包括客戶(hù)端界面結(jié)構(gòu)、從服務(wù)器的信息、大廳和房間的一切信息。當(dāng)有客戶(hù)端請(qǐng)求登錄并成功和主服務(wù)器連接的時(shí)候,主服務(wù)器將這所有的信息一次性發(fā)到客戶(hù)端內(nèi)存,客戶(hù)端根據(jù)這些信息生成界面結(jié)構(gòu)樹(shù)。
主服務(wù)器啟動(dòng)后還可以在主服務(wù)器里創(chuàng)建多個(gè)從服務(wù)器及房間,創(chuàng)建完成后從服務(wù)器的IP地址及端口號(hào)就作為它的唯一標(biāo)識(shí)被同時(shí)寫(xiě)進(jìn)數(shù)據(jù)庫(kù)和主服務(wù)器的內(nèi)存;房間號(hào)、房間所屬的游戲類(lèi)型、所屬的從服務(wù)器號(hào)也作為房間的唯一標(biāo)識(shí)被同時(shí)寫(xiě)進(jìn)數(shù)據(jù)庫(kù)和主服務(wù)器的內(nèi)存。
從服務(wù)器創(chuàng)建以后就在它所屬的機(jī)器上啟動(dòng)。
客戶(hù)端登錄后首先和主服務(wù)器建立連接(并且一直到客戶(hù)端退出才斷開(kāi))連接成功后生成界面結(jié)構(gòu)樹(shù)(前述),當(dāng)用戶(hù)點(diǎn)擊某個(gè)游戲房間的時(shí)候系統(tǒng)從內(nèi)存中讀出這個(gè)房間的所有信息(前述),根據(jù)房間所屬?gòu)姆?wù)器的IP地址及端口號(hào)試圖和這個(gè)從服務(wù)器建立連接,連接成功后相應(yīng)的從服務(wù)器就將這個(gè)房間的所有信息發(fā)到這個(gè)客戶(hù)端,客戶(hù)端收到以后就根據(jù)這些信息生成房間。每當(dāng)有客戶(hù)端的游戲位置發(fā)生改變的時(shí)候就向從服務(wù)器發(fā)送改變信息,從服務(wù)器保存、修改所有與它連接的客戶(hù)端的位置信息列表。
當(dāng)一張桌子坐滿(mǎn)時(shí)游戲開(kāi)始。游戲開(kāi)始后客戶(hù)端也是和從服務(wù)器通信以更新游戲信息。當(dāng)客戶(hù)端退出游戲后就回到大廳的這個(gè)房間,當(dāng)退出大廳的時(shí)候首先和從服務(wù)器斷開(kāi)連接,然后和主服務(wù)器斷開(kāi)連接,最后終止整個(gè)客戶(hù)端程序。
三、模塊結(jié)構(gòu)
系統(tǒng)包括三大主要模塊結(jié)構(gòu):MainServer,LocalServer,Com.此外還有客戶(hù)端安裝,更新模塊等。在三大主要模塊結(jié)構(gòu)中還有子DLL(動(dòng)態(tài)鏈接庫(kù))模塊。
1、MainServer(EXE項(xiàng)目):封裝主服務(wù)器功能,包括管理客戶(hù)端用戶(hù)身份驗(yàn)證、登錄以及管理從服務(wù)器的建立,數(shù)據(jù)庫(kù)讀寫(xiě)等。
2、LocalServer(EXE項(xiàng)目):封裝從服務(wù)器功能,包括管理客戶(hù)端游戲通信,游戲邏輯,大廳及房間等。
3、Com(EXE項(xiàng)目):封裝客戶(hù)端所有功能,包括客戶(hù)端登錄,大廳及房間,客戶(hù)端游戲通信,游戲邏輯等。Com包括以下子模塊:
客戶(hù)端通用庫(kù)PubLib(DLL模塊)封裝了客戶(hù)端通用的調(diào)用接口,控件,類(lèi)。供客戶(hù)端所有的模塊調(diào)用.
***模塊)封裝了客戶(hù)端麻將游戲通用的調(diào)用接口類(lèi)和十堰麻將類(lèi)。通用的調(diào)用接口類(lèi)供特殊的麻將游戲模塊調(diào)用。
撲克牌游戲通用庫(kù)PisaLib(DLL模塊)封裝了客戶(hù)端撲克牌游戲通用的調(diào)用接口類(lèi)。通用的調(diào)用接口類(lèi)供特殊的撲克牌游戲模塊調(diào)用。
大廳庫(kù)RoomLib(DLL模塊)封裝了客戶(hù)端大廳的調(diào)用接口。
象棋庫(kù)XQLib(DLL模塊)封裝了客戶(hù)端象棋的調(diào)用接口。
圍棋庫(kù)XQLib(DLL模塊)封裝了客戶(hù)端圍棋的調(diào)用接口。
軍棋庫(kù)XQLib(DLL模塊)封裝了客戶(hù)端軍棋的調(diào)用接口。
? ? 服務(wù)器架構(gòu)示意圖:
? ? ? 組件模塊結(jié)構(gòu)示意圖:
組件模塊以中心數(shù)據(jù)管理模塊為中心,數(shù)據(jù)庫(kù)處理模塊和SOCKET管理模塊提供外部操作聯(lián)系。以下是對(duì)每個(gè)模塊的功能和接口的介紹:
1、中心數(shù)據(jù)管理模塊繼承于CBaseMainManage類(lèi),主要是協(xié)調(diào)各個(gè)模塊的聯(lián)系,處理模塊的邏輯處理,保證數(shù)據(jù)的完整性和合理性和合法性。中心數(shù)據(jù)管理類(lèi)是單線(xiàn)程類(lèi),使用單線(xiàn)程的目的是為了使數(shù)據(jù)的處理避免了同步問(wèn)題,數(shù)據(jù)的操作不需要使用臨界變量鎖定數(shù)據(jù),加快了處理速度,但前題條件是數(shù)據(jù)處理中,不能出現(xiàn)長(zhǎng)時(shí)間的數(shù)據(jù)等待,鎖定操作存在。中心數(shù)據(jù)管理類(lèi)實(shí)現(xiàn)了IServerSocketService網(wǎng)絡(luò)數(shù)據(jù)處理接口和IDataBaseResultService數(shù)據(jù)庫(kù)結(jié)果處理接口,提供了網(wǎng)絡(luò)模塊和數(shù)據(jù)庫(kù)模塊的進(jìn)入接口,這兩個(gè)接口是供網(wǎng)絡(luò)模塊和數(shù)據(jù)庫(kù)模塊調(diào)用(意思就是調(diào)用線(xiàn)程不是于中心管理模塊的處于同一線(xiàn)程內(nèi),要注意數(shù)據(jù)同步問(wèn)題)。數(shù)據(jù)管理模塊對(duì)于這些接口調(diào)用的處理方式是先把投入的數(shù)據(jù)處理包分類(lèi),分別分為網(wǎng)絡(luò)定時(shí)器數(shù)據(jù)包,網(wǎng)絡(luò)讀取數(shù)據(jù)包,網(wǎng)絡(luò)連接關(guān)閉數(shù)據(jù)包,數(shù)據(jù)庫(kù)結(jié)果數(shù)據(jù)包,打包為數(shù)據(jù)管理類(lèi)識(shí)別的數(shù)據(jù)形式,投遞到數(shù)據(jù)管理類(lèi)的處理隊(duì)列,等待數(shù)據(jù)管理類(lèi)處理。當(dāng)中心數(shù)據(jù)管理類(lèi)需要投遞數(shù)據(jù)庫(kù)操作的時(shí)候,就通過(guò)數(shù)據(jù)管理類(lèi)的IDataBaseHandleService接口投遞請(qǐng)求(異步方式),當(dāng)數(shù)據(jù)庫(kù)處理完畢后,數(shù)據(jù)庫(kù)管理模塊會(huì)調(diào)用中心管理類(lèi)的IDataBaseResultService數(shù)據(jù)庫(kù)結(jié)果接口。
2、SOCKET管理模塊CTCPSocketManage類(lèi),主要是實(shí)現(xiàn)了管理網(wǎng)絡(luò)連接資源,處理網(wǎng)絡(luò)SOCET的讀寫(xiě)操作,主要提供了單SOCKET發(fā)送函數(shù),群發(fā)SOCKET函數(shù),SOCKET關(guān)閉函數(shù),提供SOCKET事件通知。網(wǎng)絡(luò)管理類(lèi)是多線(xiàn)程處理類(lèi)。單SOCKET發(fā)送函數(shù)是SendData函數(shù),存在著多種重載實(shí)現(xiàn),提供不同的數(shù)據(jù)發(fā)送請(qǐng)求,群發(fā)SOCKET函數(shù)是SendDataBatch函數(shù),關(guān)閉SOCKET函數(shù)是CloseSocket函數(shù),存在著多種重載實(shí)現(xiàn),當(dāng)發(fā)送了網(wǎng)絡(luò)消息讀取事件,此類(lèi)主要是通過(guò)調(diào)用OnNetMessage虛擬函數(shù),利用IServerSocketService接口把數(shù)據(jù)讀取數(shù)據(jù)包投遞到中心數(shù)據(jù)管理類(lèi)。當(dāng)網(wǎng)絡(luò)關(guān)閉的時(shí)候,也通過(guò)IServerSocketService接口把數(shù)據(jù)讀取數(shù)據(jù)包投遞到中心數(shù)據(jù)管理類(lèi)。(詳細(xì)的實(shí)現(xiàn)見(jiàn)代碼)
主要有的線(xiàn)程介紹:
○? staticunsigned__stdcallThreadAccept(LPVOIDpThreadData)(SOCKET連接應(yīng)答線(xiàn)程)
網(wǎng)絡(luò)應(yīng)答線(xiàn)程,等待外部連接,激活一個(gè)空閑的SOCKET對(duì)象,設(shè)置SOCKET參數(shù),并把這新的SOCKET對(duì)象綁定到完成端口,然后投遞緩沖區(qū)為零的數(shù)據(jù)讀取操作調(diào)用,繼續(xù)等待下一個(gè)外部連接,詳細(xì)的算法見(jiàn)代碼。
○? staticunsigned__stdcallThreadRSSocket(LPVOIDpThreadData)(SOCKET數(shù)據(jù)接收線(xiàn)程)
一個(gè)網(wǎng)絡(luò)管理類(lèi)提供了CUP*2+2個(gè)SOCKET消息響應(yīng)線(xiàn)程,負(fù)責(zé)處理網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送,讀取,關(guān)閉消息處理,詳細(xì)的算法見(jiàn)代碼。
○? staticunsigned__stdcallThreadBatchSend(LPVOIDpThreadData)(SOCKET批量發(fā)送數(shù)據(jù)線(xiàn)程)
一個(gè)網(wǎng)絡(luò)管理類(lèi)提供了一個(gè)數(shù)據(jù)群發(fā)線(xiàn)程,負(fù)責(zé)處理數(shù)據(jù)的群發(fā)異步操作。此線(xiàn)程采用優(yōu)化的隊(duì)列方式處理群發(fā)數(shù)據(jù),避免了隊(duì)列的數(shù)據(jù)移動(dòng)而帶來(lái)的數(shù)據(jù)拷貝操作,加快了處理速度,詳細(xì)的算法見(jiàn)代碼。
○? staticunsigned__stdcallThreadKeepActive(LPVOIDpThreadData)(SOCKET維護(hù)線(xiàn)程)
一個(gè)網(wǎng)絡(luò)管理類(lèi)提供了一個(gè)SOCKET維護(hù)線(xiàn)程,負(fù)責(zé)維護(hù)斷線(xiàn)或者超時(shí)的SOCKET對(duì)象,每個(gè)SOCKET對(duì)象自動(dòng)被激活開(kāi)始,服務(wù)器就會(huì)大約15秒向客戶(hù)端發(fā)送一個(gè)檢測(cè)數(shù)據(jù)包,客戶(hù)端會(huì)在收到此檢測(cè)數(shù)據(jù)包的時(shí)候馬上向服務(wù)器返回同樣的檢測(cè)數(shù)據(jù)包。在這前題條件下,維護(hù)線(xiàn)程就會(huì)大約15秒向所有的SOCKET對(duì)象都發(fā)送一個(gè)檢測(cè)數(shù)據(jù)包,并關(guān)閉掉沒(méi)有響應(yīng)的SOCKET對(duì)象,詳細(xì)的算法見(jiàn)代碼。
3、數(shù)據(jù)庫(kù)管理模塊,主要包括了數(shù)據(jù)庫(kù)管理CAFCDataBaseManage類(lèi)和數(shù)據(jù)庫(kù)處理CDataBaseHandle類(lèi)(繼承于IDataBaseHandleService接口)。CAFCDataBaseManage只實(shí)現(xiàn)了數(shù)據(jù)的連接、關(guān)閉操作和數(shù)據(jù)庫(kù)操作請(qǐng)求的投遞任務(wù),而實(shí)際的數(shù)據(jù)處理是根據(jù)不同的模塊進(jìn)行不同的數(shù)據(jù)庫(kù)處理操作,通過(guò)CDataBaseHandle實(shí)現(xiàn)實(shí)際的數(shù)據(jù)操作。這樣就避免了不同的數(shù)據(jù)庫(kù)操作重復(fù)編寫(xiě)數(shù)據(jù)庫(kù)的維護(hù),連接等代碼。CAFCDataBaseManage在會(huì)啟動(dòng)一個(gè)DataServiceThread線(xiàn)程,等待數(shù)據(jù)庫(kù)處理請(qǐng)求操作數(shù)據(jù)包,交到類(lèi)的成員變量CDataBaseHandle指針處理。
? ? 模塊編寫(xiě)實(shí)際類(lèi)分布:
每個(gè)游戲模塊(繼承于IModuleManageService接口),都包含了數(shù)據(jù)管理模塊(繼承于CBaseMainManage類(lèi))和數(shù)據(jù)庫(kù)處理模塊(繼承于CDtaBaseHandle類(lèi)),實(shí)現(xiàn)了模塊的啟動(dòng),停止,初始化,卸載功能,每個(gè)模塊需要繼承重寫(xiě)的部分就是數(shù)據(jù)庫(kù)處理模塊和數(shù)據(jù)管理模塊。
數(shù)據(jù)管理模塊包含了此組件的數(shù)據(jù)信息,邏輯處理,負(fù)責(zé)處理和發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包,更具需要投遞數(shù)據(jù)庫(kù)處理請(qǐng)求,處理數(shù)據(jù)庫(kù)處理結(jié)果。實(shí)現(xiàn)了網(wǎng)絡(luò)數(shù)據(jù)包投遞接口,數(shù)據(jù)庫(kù)處理結(jié)果處理接口。
數(shù)據(jù)庫(kù)處理模塊包含了處理數(shù)據(jù)庫(kù)請(qǐng)求處理,發(fā)送數(shù)據(jù)庫(kù)處理結(jié)果到數(shù)據(jù)管理模塊處理。實(shí)現(xiàn)了根據(jù)請(qǐng)求,實(shí)現(xiàn)合適的數(shù)據(jù)庫(kù)操作。
數(shù)據(jù)庫(kù)管理類(lèi)和網(wǎng)絡(luò)管理類(lèi)對(duì)象存在于CBaseMainManage類(lèi)中,而實(shí)際的數(shù)據(jù)庫(kù)操作類(lèi)是個(gè)獨(dú)立的類(lèi),存在于模塊管理類(lèi)中,在模塊初始化的時(shí)候把此類(lèi)的對(duì)象指針傳遞到數(shù)據(jù)庫(kù)管理類(lèi),供數(shù)據(jù)庫(kù)管理類(lèi)調(diào)用。
? ? 游戲房間模塊示意說(shuō)明:
游戲房間模塊是應(yīng)用得最多模塊之一,于其他模塊最大的不同點(diǎn)的是中心數(shù)據(jù)管理類(lèi)(繼承于CbaseMainManage類(lèi)的CComMainManage類(lèi))
數(shù)據(jù)管理類(lèi)繼承于基礎(chǔ)數(shù)據(jù)管理類(lèi),還存在CComUserInfoManage用戶(hù)管理類(lèi)和CComDesk游戲桌子類(lèi)對(duì)象數(shù)據(jù)。
曾玲
評(píng)論
查看更多