棋牌遊戲服務器架構: 詳細設計(2) 應用層設計

      這裏的應用層,指的是CenterServer、LogonServer、LogServer、RoomServer等幾個服務器,另外還包括遊戲模塊的設計。不過遊戲模塊和前4個服務器的設計很不相同。這裏先說一下服務器應用的詳細設計。數據庫

      這上面提到的四4服務器都須要響應客戶端(這裏的客戶端的意思是泛指)的請求,進行數據庫操做,同時還要可以配置,以及顯示系統運行的狀態信息等。這裏會採用MVC模式來組織應用層邏輯。服務器

                                        圖1  Application層基本結構 架構

      IController從ITCPServiceObserver繼承而來,會與ITCPServerService進行交互,所以它須要解析客戶端發過來的請求,若是須要做數據操做,則轉發給IModel處理。spa

      IModel從DBServiceObserver繼承而來,一些獲取數據及存儲數據的操做由它完成,這是經過IDatabaseServicer提供的服務完成的。設計

      IView實現了IObserver接口,主要用來顯示IController和IModel的一些狀態信息以及其餘消息。日誌

      Applications中的內個Server只要按照其任務實現IController,IModel和IView就好了。server

1  Center Server詳細設計

       CenterServer的主要功能是維護遊戲列表和房間信息。遊戲列表是從ServerInfoDB中加載到的,下面是一個簡略的結構圖。繼承

 

圖2 CenterServer維護的信息結構接口

      由於前面已經詳細介紹了應用層架構,因此這裏只是列出IModel的實現,至於IController的實現,則是解析請求。要麼用ServerList中取出遊戲列表信息和房間信息返回之。要麼向ServerList中添加房間,刪除房間以及讓ServerList更新在線人數等。隊列

      CenterServer在處理請求時產生的輸出信息會讓IView輸出顯示。

2  Logon Server 詳細設計

圖3  LogonServer結構圖

      IController的實現LogonController有如下幾個任務:

      1) 轉發註冊請求給LogonHandler讓其處理;

      2) 轉發登陸請求給LogonHander讓其處理;

      3) 定時使用CenterSocket發送請求給CenterServer, 取回的遊戲列表和房間信息存入ServerList這中。

      IModel的實現LogonHandler的主要功能就是註冊用戶以及驗證登陸。

      CenterSocket是用來向CenterServer發送請求的。

      ServerList存的數據和CenterServer中的ServerList同樣,可是其實現不一樣,它存的是LogonController從CenterServer中取回來的。

3  LogServer詳細設計

      LogServer的實現比較簡單,下面是其結構圖

圖4 LogServer結構圖

      LogServer從IController繼承下來,它接收玩家覈查遊戲過程的請求,並將其轉發給LogFetcher處理,處理完成後,將結果返回給玩家。

      LogFetcher實現了IModel, 它的任務很簡單,就是去數據庫取得遊戲過程的日誌。

4  Room Server 詳細設計

      RoomServer是最重要的一類Server,玩家的大多數操做都由它來響應,其結構圖如圖5所示。

 圖5 RoomServer結構圖

      UserManager繼承自IModel, 主要任務是管理在線玩家,RoomController在接收到玩家進入房間的請求後,就會根據玩家的的用戶名和密碼從UserInfoDB中加載該玩家的詳細信息,生成一個UserItem, 加入在線隊列。UserManager同時還會維護一個離線隊列,存儲那些請求離線或者掉線的玩家。

      RoomController實現了IController接口。它主要有如下幾個功能:

      1) 將進入房間的請求交和UserManager處理.

      2) 啓動時經過CenterSocket向CenterServer註冊,關閉時從其中註銷,同時定時經過CenterSocket從CenterServer取回遊戲列表和房間信息(因爲空間問題,圖中沒有畫出來,基本和LogonServer差很少)。

      3) 將遊戲相關的請求轉交給TableMgr處理.

      4) 處理聊天及管理請求。

       TableMgr管理着這個房間裏的桌子。而Table則是處理公共棋牌遊戲邏輯的地方。主要包括找椅子坐下,離開等。而具體地遊戲命令好比德州撲克的加註等會由Table轉發給GameModule進行處理。處理結果由RoomController返回給玩家。

5  Game Module詳細設計

      這裏以德州撲克爲例,來講明一個遊戲的邏輯的結構,

 

圖6 德州撲克遊戲模塊結構

      這裏雖然給出的是德州撲克的結構圖,可是其餘遊戲也有相似的結構。

      每個遊戲模塊都必需要實現兩個接口ITableObserver,遊戲的主要邏輯就在放在這裏面,由於桌子會將玩家的操做信息轉化之後傳遞過來,因此這裏是處理洗牌,發牌,玩家投注處理的最佳場所。另一個必須實現的接口是IGameServiceMgr,這個接口是遊戲模塊暴露給桌子的工廠接口,桌子經過它才能建立出TexasPokerTableObserver。

      IGameServiceMgr中方法說明:

      1) CreateTableObserver  建立遊戲邏輯處理的實現,這裏會建立並返回TexasPokerTableObserver。

      2) GetGameAttrib  返回遊戲的屬性,主要包括: 遊戲的名稱 ,遊戲描述,遊戲模塊的名稱,客戶端模塊名稱,遊戲數據庫名稱等

      3) RectifyRoomOption 因爲一些遊戲對房間有特殊要求,因此RoomServer須要調用這個接口調整房間的一些設置

      4) CreateAndroidUser 建立機器人的監聽者, 其角色至關於現實中的玩家。

      TexasPokerRule主要封裝了德州撲克的一些基本規則,若是選出最大牌型、比較牌型的大小,洗牌,找出贏家等。

相關文章
相關標籤/搜索