這裏的應用層,指的是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
CenterServer的主要功能是維護遊戲列表和房間信息。遊戲列表是從ServerInfoDB中加載到的,下面是一個簡略的結構圖。繼承
圖2 CenterServer維護的信息結構接口
由於前面已經詳細介紹了應用層架構,因此這裏只是列出IModel的實現,至於IController的實現,則是解析請求。要麼用ServerList中取出遊戲列表信息和房間信息返回之。要麼向ServerList中添加房間,刪除房間以及讓ServerList更新在線人數等。隊列
CenterServer在處理請求時產生的輸出信息會讓IView輸出顯示。
圖3 LogonServer結構圖
IController的實現LogonController有如下幾個任務:
1) 轉發註冊請求給LogonHandler讓其處理;
2) 轉發登陸請求給LogonHander讓其處理;
3) 定時使用CenterSocket發送請求給CenterServer, 取回的遊戲列表和房間信息存入ServerList這中。
IModel的實現LogonHandler的主要功能就是註冊用戶以及驗證登陸。
CenterSocket是用來向CenterServer發送請求的。
ServerList存的數據和CenterServer中的ServerList同樣,可是其實現不一樣,它存的是LogonController從CenterServer中取回來的。
LogServer的實現比較簡單,下面是其結構圖
圖4 LogServer結構圖
LogServer從IController繼承下來,它接收玩家覈查遊戲過程的請求,並將其轉發給LogFetcher處理,處理完成後,將結果返回給玩家。
LogFetcher實現了IModel, 它的任務很簡單,就是去數據庫取得遊戲過程的日誌。
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返回給玩家。
這裏以德州撲克爲例,來講明一個遊戲的邏輯的結構,
圖6 德州撲克遊戲模塊結構
這裏雖然給出的是德州撲克的結構圖,可是其餘遊戲也有相似的結構。
每個遊戲模塊都必需要實現兩個接口ITableObserver,遊戲的主要邏輯就在放在這裏面,由於桌子會將玩家的操做信息轉化之後傳遞過來,因此這裏是處理洗牌,發牌,玩家投注處理的最佳場所。另一個必須實現的接口是IGameServiceMgr,這個接口是遊戲模塊暴露給桌子的工廠接口,桌子經過它才能建立出TexasPokerTableObserver。
IGameServiceMgr中方法說明:
1) CreateTableObserver 建立遊戲邏輯處理的實現,這裏會建立並返回TexasPokerTableObserver。
2) GetGameAttrib 返回遊戲的屬性,主要包括: 遊戲的名稱 ,遊戲描述,遊戲模塊的名稱,客戶端模塊名稱,遊戲數據庫名稱等
3) RectifyRoomOption 因爲一些遊戲對房間有特殊要求,因此RoomServer須要調用這個接口調整房間的一些設置
4) CreateAndroidUser 建立機器人的監聽者, 其角色至關於現實中的玩家。
TexasPokerRule主要封裝了德州撲克的一些基本規則,若是選出最大牌型、比較牌型的大小,洗牌,找出贏家等。