網絡棋牌遊戲服務器架構

棋牌遊戲服務器架構算法

1、物理架構說明數據庫

遊戲系統組件包括:編程

-服務器系統(中心服務器控制系統,服務器登錄控制系統,遊戲登錄服務器,遊戲房間控制系統,遊戲組件系統),遊戲客戶端(遊戲大廳,遊戲組件)。服務器

-數據庫系統:用於保存用戶信息數據、遊戲積分數據、遊戲系統運行狀態數據,系統日誌數據等數據。網絡

-中心服務器控制系統:用於向客戶端提供全局配置,初始化數據使用。多線程

-服務器登錄控制系統:用於房間服務控制系統登錄效驗使用。架構

-遊戲房間控制系統:用於控制遊戲房間的啓動,中止,添加,刪除,管理等。異步

-遊戲組件系統:用於具體遊戲服務,被遊戲房間控制系統掛接,提供遊戲服務。分佈式

-遊戲大廳:遊戲玩家鏈接遊戲使用。函數

2、系統結構

   系統選用的開發工具是優秀的Microsoft Visual C++.net2003,系統採用客戶端/服務器(C/S)編程模式,TCP/IP協議做爲客戶端和服務器的通訊網絡層,運用具備性能最優的完成端口(IOCP:Input/Output Completion Port )網絡開發模型搭建服務器軟件.客戶端採用WinSocket API做爲網絡層。

   系統採用多服務器分佈式架構,由一箇中心服務器(CENTERSERVER),多個主服務器(MainServer)和多個從服務器(LocalServer)同時工做以實現遊戲邏輯和用戶管理及通信的功能。中心服務器向客戶端提供全局配置,初始化數據(主要是定位一個主服務器IP地址),主服務器管理客戶端用戶身份驗證、登陸以及管理從服務器的創建,由多個從服務器管理遊戲通訊,大廳及房間,從服務器可任意添加、刪除、修改等。

   系統首先啓動中心服務器(CENTERSERVER), 中心服務器從INI文件中讀取MainServer列表信息, 客戶端提供全局配置,初始化數據,而後等待客戶聯結, 客戶聯結後CENTERSERVER定位一個MainServer的IP地址和端口號,發往客戶端, 客戶端收到後斷開CENTERSERVER的聯接,並立刻用MainServer的IP地址和端口號,和主服務器(MainServer)鏈接.主服務器從數據庫中讀取從服務器的全部信息到主服務器的內存。首先讀取ComType表以創建全部的遊戲類型的基本信息,而後讀取ServiceInfo(界面樹結點信息表)以得到包括客戶端界面結構、從服務器的信息、大廳和房間的一切信息。當有客戶端請求登陸併成功和主服務器鏈接的時候,主服務器將這全部的信息一次性發到客戶端內存,客戶端根據這些信息生成界面結構樹。

   主服務器啓動後還能夠在主服務器裏建立多個從服務器及房間,建立完成後從服務器的IP地址及端口號就做爲它的惟一標識被同時寫進數據庫和主服務器的內存;房間號、房間所屬的遊戲類型、所屬的從服務器號也做爲房間的惟一標識被同時寫進數據庫和主服務器的內存。

從服務器建立之後就在它所屬的機器上啓動。

   客戶端登陸後首先和主服務器創建鏈接(而且一直到客戶端退出才斷開)鏈接成功後生成界面結構樹(前述),當用戶點擊某個遊戲房間的時候系統從內存中讀出這個房間的全部信息(前述),根據房間所屬從服務器的IP地址及端口號試圖和這個從服務器創建鏈接,鏈接成功後相應的從服務器就將這個房間的全部信息發到這個客戶端,客戶端收到之後就根據這些信息生成房間。每當有客戶端的遊戲位置發生改變的時候就向從服務器發送改變信息,從服務器保存、修改全部與它鏈接的客戶端的位置信息列表。

   當一張桌子坐滿時遊戲開始。遊戲開始後客戶端也是和從服務器通訊以更新遊戲信息。 當客戶端退出遊戲後就回到大廳的這個房間,當退出大廳的時候首先和從服務器斷開鏈接,而後和主服務器斷開鏈接,最後終止整個客戶端程序。

3、模塊結構

系統包括三大主要模塊結構:MainServer,LocalServer,Com.此外還有客戶端安裝,更新模塊等。在三大主要模塊結構中還有子DLL(動態連接庫)模塊。

一、MainServer(EXE項目):封裝主服務器功能,包括管理客戶端用戶身份驗證、登陸以及管理從服務器的創建,數據庫讀寫等。

二、LocalServer(EXE項目):封裝從服務器功能,包括管理客戶端遊戲通訊,遊戲邏輯,大廳及房間等。

三、Com(EXE項目):封裝客戶端全部功能,包括客戶端登陸,大廳及房間,客戶端遊戲通訊,遊戲邏輯等。Com包括如下子模塊:

a.客戶端通用庫PubLib(DLL模塊)封裝了客戶端通用的調用接口,控件,類。供客戶端全部的模塊調用.

b.麻將遊戲通用庫MJLib(DLL模塊)封裝了客戶端麻將遊戲通用的調用接口類和十堰麻將類。通用的調用接口類供特殊的麻將遊戲模塊調用。

c.撲克牌遊戲通用庫PisaLib(DLL模塊)封裝了客戶端撲克牌遊戲通用的調用接口類。通用的調用接口類供特殊的撲克牌遊戲模塊調用。

d.大廳庫RoomLib(DLL模塊)封裝了客戶端大廳的調用接口。

e.象棋庫XQLib(DLL模塊)封裝了客戶端象棋的調用接口。

f.圍棋庫XQLib(DLL模塊)封裝了客戶端圍棋的調用接口。

d.軍棋庫XQLib(DLL模塊)封裝了客戶端軍棋的調用接口。

服務器架構示意圖:

組件模塊結構示意圖:

組件模塊以中心數據管理模塊爲中心,數據庫處理模塊和SOCKET管理模塊提供外部操做聯繫。如下是對每一個模塊的功能和接口的介紹:

1.中心數據管理模塊繼承於CBaseMainManage類,主要是協調各個模塊的聯繫,處理模塊的邏輯處理,保證數據的完整性和合理性和合法性。中心數據管理類是單線程類,使用單線程的目的是爲了使數據的處理避免了同步問題,數據的操做不須要使用臨界變量鎖定數據,加快了處理速度,但前題條件是數據處理中,不能出現長時間的數據等待,鎖定操做存在。中心數據管理類實現了IServerSocketService網絡數據處理接口和IDataBaseResultService數據庫結果處理接口,提供了網絡模塊和數據庫模塊的進入接口,這兩個接口是供網絡模塊和數據庫模塊調用(意思就是調用線程不是於中心管理模塊的處於同一線程內,要注意數據同步問題)。數據管理模塊對於這些接口調用的處理方式是先把投入的數據處理包分類,分別分爲網絡定時器數據包,網絡讀取數據包,網絡鏈接關閉數據包,數據庫結果數據包,打包爲數據管理類識別的數據形式,投遞到數據管理類的處理隊列,等待數據管理類處理。當中心數據管理類須要投遞數據庫操做的時候,就經過數據管理類的IDataBaseHandleService接口投遞請求(異步方式),當數據庫處理完畢後,數據庫管理模塊會調用中心管理類的IDataBaseResultService數據庫結果接口。

2.SOCKET 管理模塊CTCPSocketManage類,主要是實現了管理網絡鏈接資源,處理網絡SOCET的讀寫操做,主要提供了單SOCKET發送函數,羣發SOCKET函數,SOCKET關閉函數,提供SOCKET事件通知。網絡管理類是多線程處理類。單 SOCKET 發送函數是 SendData 函數,存在着多種重載實現,提供不一樣的數據發送請求,羣發 SOCKET 函數是 SendDataBatch 函數,關閉 SOCKET 函數是 CloseSocket 函數,存在着多種重載實現,當發送了網絡消息讀取事件,此類主要是經過調用OnNetMessage 虛擬函數,利用IServerSocketService接口把數據讀取數據包投遞到中心數據管理類。當網絡關閉的時候,也經過IServerSocketService接口把數據讀取數據包投遞到中心數據管理類。(詳細的實現見代碼)

主要有的線程介紹:

-static unsigned __stdcall ThreadAccept(LPVOID pThreadData) (SOCKET 鏈接應答線程)

網絡應答線程,等待外部鏈接,激活一個空閒的 SOCKET 對象,設置 SOCKET 參數,並把這新的 SOCKET 對象綁定到完成端口,而後投遞緩衝區爲零的數據讀取操做調用,繼續等待下一個外部鏈接,詳細的算法見代碼。

-static unsigned __stdcall ThreadRSSocket(LPVOID pThreadData) (SOCKET 數據接收線程)

一個網絡管理類提供了 CUP*2+2 個 SOCKET 消息響應線程,負責處理網絡數據的發送,讀取,關閉消息處理,詳細的算法見代碼。

-static unsigned __stdcall ThreadBatchSend(LPVOID pThreadData) (SOCKET 批量發送數據線程)

一個網絡管理類提供了一個數據羣發線程,負責處理數據的羣發異步操做。此線程採用優化的隊列方式處理羣發數據,避免了隊列的數據移動而帶來的數據拷貝操做,加快了處理速度,詳細的算法見代碼。

-static unsigned __stdcall ThreadKeepActive(LPVOID pThreadData) (SOCKET 維護線程)

一個網絡管理類提供了一個SOCKET 維護線程,負責維護斷線或者超時的 SOCKET 對象,每一個 SOCKET 對象自動被激活開始,服務器就會大約 15 秒向客戶端發送一個檢測數據包,客戶端會在收到此檢測數據包的時候立刻向服務器返回一樣的檢測數據包。在這前題條件下,維護線程就會大約 15 秒向全部的 SOCKET 對象都發送一個檢測數據包,並關閉掉沒有響應的 SOCKET 對象,詳細的算法見代碼。

3.數據庫管理模塊,主要包括了數據庫管理CAFCDataBaseManage類和數據庫處理CDataBaseHandle類(繼承於IDataBaseHandleService接口)。CAFCDataBaseManage只實現了數據的鏈接、關閉操做和數據庫操做請求的投遞任務,而實際的數據處理是根據不一樣的模塊進行不一樣的數據庫處理操做,經過CDataBaseHandle實現實際的數據操做。這樣就避免了不一樣的數據庫操做重複編寫數據庫的維護,鏈接等代碼。CAFCDataBaseManage在會啓動一個DataServiceThread線程,等待數據庫處理請求操做數據包,交到類的成員變量CDataBaseHandle指針處理。

模塊編寫實際類分佈:

   每一個遊戲模塊(繼承於IModuleManageService接口),都包含了數據管理模塊(繼承於CBaseMainManage類)和數據庫處理模塊(繼承於CDtaBaseHandle類),實現了模塊的啓動,中止,初始化,卸載功能,每一個模塊須要繼承重寫的部分就是數據庫處理模塊和數據管理模塊。

   數據管理模塊包含了此組件的數據信息,邏輯處理,負責處理和發送網絡數據包,更具須要投遞數據庫處理請求,處理數據庫處理結果。實現了網絡數據包投遞接口,數據庫處理結果處理接口。

   數據庫處理模塊包含了處理數據庫請求處理,發送數據庫處理結果到數據管理模塊處理。實現了根據請求,實現合適的數據庫操做。

   數據庫管理類和網絡管理類對象存在於CBaseMainManage類中,而實際的數據庫操做類是個獨立的類,存在於模塊管理類中,在模塊初始化的時候把此類的對象指針傳遞到數據庫管理類,供數據庫管理類調用。

遊戲房間模塊示意說明:

遊戲房間模塊是應用得最多模塊之一,於其餘模塊最大的不一樣點的是中心數據管理類(繼承於CbaseMainManage類的CComMainManage類)

數據管理類繼承於基礎數據管理類,還存在CComUserInfoManage用戶管理類和CComDesk遊戲桌子類對象數據。

香港新世界機房www.31003.net交流qq236225612

相關文章
相關標籤/搜索