青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

MMO聊天服務器設計

MMO中的聊天服務主要功能就是做客戶端之間的聊天內容轉發。但是聊天的形式有很多,例如私聊、同場景聊、隊伍內聊、工會內聊、全服務器聊、甚至臨 時組建房間聊。這些邏輯功能其實都是可以做在邏輯服務器上的,最多改改世界服務器,但是這樣完成功能的話,不免將聊天本身的邏輯與游戲邏輯關聯起來。我們 希望做得更上一層,將聊天服務本身脫離開來。但是獨立聊天服務還不夠,因為就算獨立出來了,也有可能在實現上與具體的游戲邏輯相關聯。所以,我們做了進一 步的抽象,想實現一個更為通用的聊天服務器。

設計實現

實體設計

聊天這個過程,我們將其抽象為實體(entity)與實體間的對話。這個實體概念其實很寬泛。任何可接收聊天消息的都算做實體,例如單個玩家、一個 場景、一個隊伍、一個房間、一個工會、甚至整個服務器。這個思想其實就是支持整個聊天服務器設計的最根本思想。最開始,我將聊天服務器分為個體和組兩個概 念,其實這個抽象程度都太低,并且會導致實現上的復雜。相反,將整個系統完全使用實體這個概念來組裝,就簡單很多。當然,實體是有很多種類的,在處理接收 聊天消息這個動作時,其處理方式就不同。例如單個玩家實體僅做消息的發送,場景實體則是將消息發給場景內的所有玩家,隊伍實體就是將消息發給隊伍內的所有 玩家。從這一點來看,我們的實體種類其實并不多,因為場景、隊伍這些,都是組實體(group entity)。用C++來描述:

class Entity {
public:
    
// send text to this entity
    virtual bool Send(Entity *sender, const std::string &text) = 0;

protected:
    GUID m_id;
    
int m_type;
};

class SockEntity : pubilc Entity {
public:
    
virtual bool Send(Entity *sender, const std::string &text) {
        
// find the map socket and send text to the socket
        long socket = FindSocket(this);
        Message msg(MSG_CS2E_SENDTEXT);
        msg.Add(sender
->ID());
        msg.Add(text);
        msg.SendToSocket(socket);
        
return true;
    }
};

class GroupEntity : public Entity {
public:
    
virtual bool Send(Entity *sender, const std::string &text) {
        
for (std::list<Entity*>::const_iterator it = m_mems.begin(); it != m_mems.end(); ++it) {
            (
*it)->Send(sender, text);
        }
        
return true;
    }
private:
    std::list
<Entity*> m_mems;
};


SockEntity用于表示物理上聊天服務器的客戶端,例如游戲客戶端。

網絡拓撲

實際上,除了轉發聊天內容外(Entity::Send),實體還有很多其他行為,例如最起碼的,創建組實體,往組實體里添加成員等。在設計上,組 實體的創建由邏輯服務器或者其他服務器來完成,目前游戲客戶端是沒有創建組實體的權限的(實現上我們還為實體添加了權限驗證機制)。在網絡拓撲上,聊天服 務器始終是作為服務器角色,而它的客戶端則包括游戲客戶端、邏輯服務器、甚至其他服務器,這樣聊天服務器在提供了固定的協議后,它就是完全獨立的,不依賴 任何其他組件:

             CS
          
/  |  \
         
/   |   \
        
/    |    \
       GC   GC   GS

(CS: Chat Server, GC: Game Client, GS: Game Server)

基于此,我們擴充了Entity的類體系:

class ClientEntity : public SockEntity {

private:
    GUID m_gsEntity; 
// 標示該客戶端實體位于哪個邏輯服務器實體上
};

class GSEntity : public SockEntity {
};

消息協議

聊天服務器的核心實現,其實就是針對以上實體做操作。因此,聊天服務器的消息協議方面,也主要是針對這些實體的操作,包括:

  • 創建

    實體的創建很簡單,不同的實體其創建所需的參數都不一樣。例如客戶端實體創建時需要傳入一個邏輯服務器實體的ID,組實體的創建可以攜帶組成員實體列表。 為了處理權限和安全問題,在具體實現上,邏輯服務器實體的創建是由聊天服務器本地的配置決定,即聊天服務器啟動則根據配置創建好邏輯服務器實體;客戶端實 體是當角色進入邏輯服務器后,由服務器創建,客戶端無法創建實體。

  • 刪除

    實體的刪除為了處理方便,約定刪除請求必須由實體的創建者發起。因為從邏輯上將,某個模塊如果可以創建一個實體,那么其必然知道什么時候該刪除這個實體。

  • 修改

    修改指的是修改實體內部實現的一些屬性,例如組實體修改其組成員。這個操作是非常重要的。對于SockEntity而 言,修改意味著修改其連接狀態,例如當邏輯服務器在聊天服務器上創建了客戶端實體后,實際上此時客戶端并沒有在網絡方面連接聊天服務器,此時這個Entity實 際上是不可用的,因為它無法用于發送消息。這個時候我們標志該實體的狀態為非連接狀態。當客戶端主動連接上聊天服務器后,客戶端就主動發起修改自己對應的 客戶端實體請求,該請求將自己的狀態修改為連接狀態。當客戶端關閉時,聊天服務器網絡層接收到連接斷開通知,該通知肯定是早于邏輯服務器發來的刪除實體通 知的,此時將該客戶端實體狀態修改為斷開狀態,并在接收到邏輯服務器刪除實體通知時將其真正刪除。這里展示的這種狀態修改策略,實際上在整個系統中是非常 重要的。它用于指導網絡連接和上層邏輯之間的關系,因為整個聊天系統中,各個進程的狀態是不可預料的(隨時可能宕掉),當某個進程尤其是邏輯服務器宕掉 后,聊天服務器是得不到任何正常邏輯通知的,它只能得到網絡連接的通知。

總結

整個系統實現下來,實際上是非常簡單的,代碼量也很少。當然還有很多細節問題,例如聊天信息中攜帶物品信息,這涉及到異步預處理聊天內容,這里就不 方便細說了。

原文地址: http://codemacro.com/2012/08/29/mmo-chat-server/
written by Kevin Lynx  posted at http://codemacro.com

posted on 2012-08-29 11:37 Kevin Lynx 閱讀(3621) 評論(2)  編輯 收藏 引用 所屬分類: game develop

評論

# re: MMO聊天服務器設計 2012-08-29 12:29 飯中淹

感覺過于強調實體,反而讓概念顯得不清楚了,屬于過度抽象。
從現實來講
頻道和聊天者的概念會比較清晰一點。  回復  更多評論   

# re: MMO聊天服務器設計 2012-08-30 21:26 畢達哥拉斯半圓

同意樓上,不管什么實體,映射到Chat-Server上某個channel的就可以了,話說,我也想有個ChatServer做一些事情,不過目前的想法是基于Irc server/client改一改,感覺這樣比較簡單且快速一點。  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国内精品在线| 一本色道久久综合狠狠躁篇怎么玩| 亚洲国产成人久久综合一区| 亚洲欧洲av一区二区三区久久| 在线电影一区| 欧美日韩国产综合视频在线| 欧美一区二区视频在线| 在线天堂一区av电影| 久久婷婷成人综合色| 欧美不卡视频| 亚洲视频在线观看三级| 一区二区三区欧美亚洲| 欧美激情精品久久久六区热门 | 亚洲精品在线免费观看视频| 欧美三级免费| 欧美韩日亚洲| 国产精品伊人日日| 亚洲国产美女精品久久久久∴| 欧美体内谢she精2性欧美| 久久久久久亚洲综合影院红桃| 日韩视频免费看| 亚洲午夜在线| 久久人人爽人人爽爽久久| 先锋影音一区二区三区| 老色鬼精品视频在线观看播放| 亚洲欧美日韩国产综合| 欧美日韩mv| 亚洲日本va午夜在线电影| 亚洲一区二区三区四区中文| 欧美国内亚洲| 欧美一区二区三区精品电影| 欧美一区二区福利在线| 欧美区日韩区| 亚洲精品美女在线观看| 亚洲一区二区三区欧美| 久久久国产精品一区| 亚洲国产一区二区三区青草影视| 亚洲午夜久久久久久久久电影网| 欧美午夜电影在线| 亚洲久久成人| 一区二区三区国产| 亚洲综合色在线| 亚洲男女自偷自拍| 欧美激情一区二区三区在线视频观看 | 在线视频亚洲一区| 欧美激情第3页| 亚洲国产精品女人久久久| 母乳一区在线观看| 欧美日韩中文| 一区二区欧美激情| 国产精品video| 狠狠色综合网| 欧美1区2区视频| 日韩午夜精品| 久久国产精品久久久久久电车| 国产伦精品一区二区三区| 午夜伦理片一区| 欧美肥婆在线| 香蕉乱码成人久久天堂爱免费| 在线看片成人| 国产精品成人免费视频| 久久精品99| 亚洲欧美视频在线观看| 欧美国产高清| 欧美一区中文字幕| 日韩视频三区| 亚洲国产精品高清久久久| 欧美日精品一区视频| 另类av一区二区| 欧美一区永久视频免费观看| 亚洲日本激情| 亚洲美女视频网| 国产日韩精品视频一区| 欧美另类一区| 老鸭窝91久久精品色噜噜导演| 亚洲男人的天堂在线观看| 一区二区激情视频| 91久久国产自产拍夜夜嗨| 快播亚洲色图| 老司机aⅴ在线精品导航| 欧美在线一二三四区| 欧美一区二区三区的| 久久精品视频亚洲| 国产精品日韩二区| 免费美女久久99| 久久久久国产精品午夜一区| 性欧美xxxx大乳国产app| 亚洲欧美国产毛片在线| 亚洲在线中文字幕| 久久国产精品99久久久久久老狼 | 国产精品美女黄网| 国产精品电影网站| 国产精品美女久久久久久2018| 欧美四级电影网站| 国产精品揄拍500视频| 国产一区二区在线免费观看| 激情成人综合网| 亚洲视频在线二区| 久久精品中文字幕一区| 免费高清在线一区| 一区二区三区欧美| 久久精品人人爽| 欧美午夜宅男影院在线观看| 国产精品视频精品视频| 在线观看视频亚洲| 午夜精品一区二区三区在线播放 | 最近看过的日韩成人| 亚洲图片激情小说| 免费亚洲电影| 国产日韩欧美三区| 99精品视频免费观看| 欧美一区二区三区视频| 亚洲国产精品99久久久久久久久| 亚洲一区二区三区中文字幕在线| 久久久精品999| 国产精品美女www爽爽爽| 亚洲黄色免费网站| 老司机精品福利视频| 性欧美video另类hd性玩具| 欧美精品三级日韩久久| 亚洲大胆美女视频| 久久久久久久久久久一区 | 欧美一级淫片播放口| 亚洲久久在线| 欧美屁股在线| 亚洲一区二区三区四区视频| 亚洲精品免费在线播放| 久久久欧美精品| 久久精品观看| 在线看一区二区| 亚洲高清久久久| 欧美喷潮久久久xxxxx| 亚洲一区二区高清视频| 亚洲伊人一本大道中文字幕| 国产视频欧美| 久久综合给合| 欧美激情视频一区二区三区免费| 亚洲美女视频网| 亚洲欧美日韩在线播放| 黄色亚洲网站| 美女日韩欧美| 欧美日韩一本到| 西西裸体人体做爰大胆久久久| 欧美在线日韩在线| 日韩性生活视频| 欧美淫片网站| 一本色道久久加勒比88综合| 一区二区三区四区五区精品| 精品不卡一区二区三区| 一本色道久久综合亚洲精品不| 国内一区二区在线视频观看| 亚洲国产清纯| 激情婷婷久久| 午夜国产精品影院在线观看| 9l视频自拍蝌蚪9l视频成人| 性欧美超级视频| 亚洲欧美日本另类| 欧美日韩爆操| 亚洲精品1区| 欧美午夜一区二区福利视频| 亚洲风情亚aⅴ在线发布| 国产字幕视频一区二区| 午夜精彩国产免费不卡不顿大片| 亚洲淫性视频| 国产精品国产三级国产aⅴ无密码| 欧美成人午夜激情在线| 国外视频精品毛片| 久久精品国产综合| 鲁鲁狠狠狠7777一区二区| 国产综合自拍| 另类尿喷潮videofree| 欧美成人精品在线视频| 一区二区视频免费在线观看| 久久国产精品一区二区| 国产日韩综合| 久久成人18免费网站| 久久午夜影视| 亚洲美女在线看| 欧美视频在线观看免费| 亚洲天堂av在线免费| 久久精品国产99国产精品| 曰韩精品一区二区| 欧美日韩国产黄| 欧美在线一区二区三区| 欧美激情一区三区| 亚洲一区二区三区乱码aⅴ| 国产一区二区三区在线观看免费视频| 久久视频一区二区| 中国女人久久久| 亚洲第一精品福利| 午夜精品久久久久久久99水蜜桃| 狠狠色狠狠色综合日日五| 欧美精品午夜视频| 欧美一区二区三区精品| 99精品欧美| 亚洲精品欧洲| 欧美ab在线视频| 久久久国产精品亚洲一区| 亚洲一区亚洲| av成人免费在线|