棋牌游戏服务器架构: 详细设计(二) 应用层设计
這里的應(yīng)用層,指的是CenterServer、LogonServer、LogServer、RoomServer等幾個服務(wù)器,另外還包括游戲模塊的設(shè)計。不過游戲模塊和前4個服務(wù)器的設(shè)計很不相同。這里先說一下服務(wù)器應(yīng)用的詳細(xì)設(shè)計。
? ? ??這上面提到的四4服務(wù)器都需要響應(yīng)客戶端(這里的客戶端的意思是泛指)的請求,進(jìn)行數(shù)據(jù)庫操作,同時還要能夠配置,以及顯示系統(tǒng)運(yùn)行的狀態(tài)信息等。這里會采用MVC模式來組織應(yīng)用層邏輯。
?圖1 ?Application層基本結(jié)構(gòu)
? ? ? IController從ITCPServiceObserver繼承而來,會與ITCPServerService進(jìn)行交互,因此它需要解析客戶端發(fā)過來的請求,如果需要作數(shù)據(jù)操作,則轉(zhuǎn)發(fā)給IModel處理。
? ? ? IModel從DBServiceObserver繼承而來,一些獲取數(shù)據(jù)及存儲數(shù)據(jù)的操作由它完成,這是通過IDatabaseServicer提供的服務(wù)完成的。
? ? ? IView實(shí)現(xiàn)了IObserver接口,主要用來顯示IController和IModel的一些狀態(tài)信息以及其他消息。
? ? ? Applications中的內(nèi)個Server只要按照其任務(wù)實(shí)現(xiàn)IController,IModel和IView就行了。
1? Center Server詳細(xì)設(shè)計
? ? ? ?CenterServer的主要功能是維護(hù)游戲列表和房間信息。游戲列表是從ServerInfoDB中加載到的,下面是一個簡略的結(jié)構(gòu)圖。
?
圖2 CenterServer維護(hù)的信息結(jié)構(gòu)
? ? ? 因?yàn)榍懊嬉呀?jīng)詳細(xì)介紹了應(yīng)用層架構(gòu),所以這里只是列出IModel的實(shí)現(xiàn),至于IController的實(shí)現(xiàn),則是解析請求。要么用ServerList中取出游戲列表信息和房間信息返回之。要么向ServerList中添加房間,刪除房間以及讓ServerList更新在線人數(shù)等。
? ? ? CenterServer在處理請求時產(chǎn)生的輸出信息會讓IView輸出顯示。
2? Logon Server 詳細(xì)設(shè)計
圖3 ?LogonServer結(jié)構(gòu)圖
? ? ? IController的實(shí)現(xiàn)LogonController有以下幾個任務(wù):
? ? ? 1) 轉(zhuǎn)發(fā)注冊請求給LogonHandler讓其處理;
? ? ? 2) 轉(zhuǎn)發(fā)登錄請求給LogonHander讓其處理;
? ? ? 3) 定時使用CenterSocket發(fā)送請求給CenterServer, 取回的游戲列表和房間信息存入ServerList這中。
? ? ? IModel的實(shí)現(xiàn)LogonHandler的主要功能就是注冊用戶以及驗(yàn)證登錄。
? ? ? CenterSocket是用來向CenterServer發(fā)送請求的。
? ? ? ServerList存的數(shù)據(jù)和CenterServer中的ServerList一樣,但是其實(shí)現(xiàn)不同,它存的是LogonController從CenterServer中取回來的。
3? LogServer詳細(xì)設(shè)計
? ? ? LogServer的實(shí)現(xiàn)比較簡單,下面是其結(jié)構(gòu)圖
圖4 LogServer結(jié)構(gòu)圖
? ? ? LogServer從IController繼承下來,它接收玩家核查游戲過程的請求,并將其轉(zhuǎn)發(fā)給LogFetcher處理,處理完成后,將結(jié)果返回給玩家。
? ? ? LogFetcher實(shí)現(xiàn)了IModel, 它的任務(wù)很簡單,就是去數(shù)據(jù)庫取得游戲過程的日志。
4? Room Server 詳細(xì)設(shè)計
? ? ? RoomServer是最重要的一類Server,玩家的大多數(shù)操作都由它來響應(yīng),其結(jié)構(gòu)圖如圖5所示。
?圖5 RoomServer結(jié)構(gòu)圖
? ? ? UserManager繼承自IModel, 主要任務(wù)是管理在線玩家,RoomController在接收到玩家進(jìn)入房間的請求后,就會根據(jù)玩家的的用戶名和密碼從UserInfoDB中加載該玩家的詳細(xì)信息,生成一個UserItem, 加入在線隊列。UserManager同時還會維護(hù)一個離線隊列,存儲那些請求離線或者掉線的玩家。
? ? ? RoomController實(shí)現(xiàn)了IController接口。它主要有以下幾個功能:
? ? ? 1) 將進(jìn)入房間的請求交和UserManager處理.
? ? ? 2) 啟動時通過CenterSocket向CenterServer注冊,關(guān)閉時從其中注銷,同時定時通過CenterSocket從CenterServer取回游戲列表和房間信息(由于空間問題,圖中沒有畫出來,基本和LogonServer差不多)。
? ? ? 3) 將游戲相關(guān)的請求轉(zhuǎn)交給TableMgr處理.
? ? ? 4) 處理聊天及管理請求。
? ? ? ?TableMgr管理著這個房間里的桌子。而Table則是處理公共棋牌游戲邏輯的地方。主要包括找椅子坐下,離開等。而具體地游戲命令比如德州撲克的加注等會由Table轉(zhuǎn)發(fā)給GameModule進(jìn)行處理。處理結(jié)果由RoomController返回給玩家。
5 ?Game Module詳細(xì)設(shè)計
? ? ? 這里以德州撲克為例,來說明一個游戲的邏輯的結(jié)構(gòu),
?
圖6 德州撲克游戲模塊結(jié)構(gòu)
? ? ? 這里雖然給出的是德州撲克的結(jié)構(gòu)圖,但是其他游戲也有類似的結(jié)構(gòu)。
? ? ? 每一個游戲模塊都必須要實(shí)現(xiàn)兩個接口ITableObserver,游戲的主要邏輯就在放在這里面,因?yàn)樽雷訒⑼婕业牟僮餍畔⑥D(zhuǎn)化以后傳遞過來,所以這里是處理洗牌,發(fā)牌,玩家投注處理的最佳場所。另外一個必須實(shí)現(xiàn)的接口是IGameServiceMgr,這個接口是游戲模塊暴露給桌子的工廠接口,桌子通過它才能創(chuàng)建出TexasPokerTableObserver。
? ? ? IGameServiceMgr中方法說明:
? ? ? 1) CreateTableObserver? 創(chuàng)建游戲邏輯處理的實(shí)現(xiàn),這里會創(chuàng)建并返回TexasPokerTableObserver。
? ? ? 2) GetGameAttrib? 返回游戲的屬性,主要包括: 游戲的名稱 ,游戲描述,游戲模塊的名稱,客戶端模塊名稱,游戲數(shù)據(jù)庫名稱等
? ? ? 3) RectifyRoomOption 由于一些游戲?qū)Ψ块g有特殊要求,所以RoomServer需要調(diào)用這個接口調(diào)整房間的一些設(shè)置
? ? ? 4) CreateAndroidUser 創(chuàng)建機(jī)器人的監(jiān)聽者, 其角色相當(dāng)于現(xiàn)實(shí)中的玩家。
? ? ? TexasPokerRule主要封裝了德州撲克的一些基本規(guī)則,如果選出最大牌型、比較牌型的大小,洗牌,找出贏家等。
總結(jié)
以上是生活随笔為你收集整理的棋牌游戏服务器架构: 详细设计(二) 应用层设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 棋牌游戏服务器架构: 详细设计(一) 内
- 下一篇: 反汇编程序导致程序crash的解决思路