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

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

MMO聊天服務(wù)器設(shè)計(jì)

MMO中的聊天服務(wù)主要功能就是做客戶(hù)端之間的聊天內(nèi)容轉(zhuǎn)發(fā)。但是聊天的形式有很多,例如私聊、同場(chǎng)景聊、隊(duì)伍內(nèi)聊、工會(huì)內(nèi)聊、全服務(wù)器聊、甚至臨 時(shí)組建房間聊。這些邏輯功能其實(shí)都是可以做在邏輯服務(wù)器上的,最多改改世界服務(wù)器,但是這樣完成功能的話(huà),不免將聊天本身的邏輯與游戲邏輯關(guān)聯(lián)起來(lái)。我們 希望做得更上一層,將聊天服務(wù)本身脫離開(kāi)來(lái)。但是獨(dú)立聊天服務(wù)還不夠,因?yàn)榫退悛?dú)立出來(lái)了,也有可能在實(shí)現(xiàn)上與具體的游戲邏輯相關(guān)聯(lián)。所以,我們做了進(jìn)一 步的抽象,想實(shí)現(xiàn)一個(gè)更為通用的聊天服務(wù)器。

設(shè)計(jì)實(shí)現(xiàn)

實(shí)體設(shè)計(jì)

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

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用于表示物理上聊天服務(wù)器的客戶(hù)端,例如游戲客戶(hù)端。

網(wǎng)絡(luò)拓?fù)?/h3>

實(shí)際上,除了轉(zhuǎn)發(fā)聊天內(nèi)容外(Entity::Send),實(shí)體還有很多其他行為,例如最起碼的,創(chuàng)建組實(shí)體,往組實(shí)體里添加成員等。在設(shè)計(jì)上,組 實(shí)體的創(chuàng)建由邏輯服務(wù)器或者其他服務(wù)器來(lái)完成,目前游戲客戶(hù)端是沒(méi)有創(chuàng)建組實(shí)體的權(quán)限的(實(shí)現(xiàn)上我們還為實(shí)體添加了權(quán)限驗(yàn)證機(jī)制)。在網(wǎng)絡(luò)拓?fù)渖希奶旆?務(wù)器始終是作為服務(wù)器角色,而它的客戶(hù)端則包括游戲客戶(hù)端、邏輯服務(wù)器、甚至其他服務(wù)器,這樣聊天服務(wù)器在提供了固定的協(xié)議后,它就是完全獨(dú)立的,不依賴(lài) 任何其他組件:

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

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

基于此,我們擴(kuò)充了Entity的類(lèi)體系:

class ClientEntity : public SockEntity {

private:
    GUID m_gsEntity; 
// 標(biāo)示該客戶(hù)端實(shí)體位于哪個(gè)邏輯服務(wù)器實(shí)體上
};

class GSEntity : public SockEntity {
};

消息協(xié)議

聊天服務(wù)器的核心實(shí)現(xiàn),其實(shí)就是針對(duì)以上實(shí)體做操作。因此,聊天服務(wù)器的消息協(xié)議方面,也主要是針對(duì)這些實(shí)體的操作,包括:

  • 創(chuàng)建

    實(shí)體的創(chuàng)建很簡(jiǎn)單,不同的實(shí)體其創(chuàng)建所需的參數(shù)都不一樣。例如客戶(hù)端實(shí)體創(chuàng)建時(shí)需要傳入一個(gè)邏輯服務(wù)器實(shí)體的ID,組實(shí)體的創(chuàng)建可以攜帶組成員實(shí)體列表。 為了處理權(quán)限和安全問(wèn)題,在具體實(shí)現(xiàn)上,邏輯服務(wù)器實(shí)體的創(chuàng)建是由聊天服務(wù)器本地的配置決定,即聊天服務(wù)器啟動(dòng)則根據(jù)配置創(chuàng)建好邏輯服務(wù)器實(shí)體;客戶(hù)端實(shí) 體是當(dāng)角色進(jìn)入邏輯服務(wù)器后,由服務(wù)器創(chuàng)建,客戶(hù)端無(wú)法創(chuàng)建實(shí)體。

  • 刪除

    實(shí)體的刪除為了處理方便,約定刪除請(qǐng)求必須由實(shí)體的創(chuàng)建者發(fā)起。因?yàn)閺倪壿嬌蠈ⅲ硞€(gè)模塊如果可以創(chuàng)建一個(gè)實(shí)體,那么其必然知道什么時(shí)候該刪除這個(gè)實(shí)體。

  • 修改

    修改指的是修改實(shí)體內(nèi)部實(shí)現(xiàn)的一些屬性,例如組實(shí)體修改其組成員。這個(gè)操作是非常重要的。對(duì)于SockEntity而 言,修改意味著修改其連接狀態(tài),例如當(dāng)邏輯服務(wù)器在聊天服務(wù)器上創(chuàng)建了客戶(hù)端實(shí)體后,實(shí)際上此時(shí)客戶(hù)端并沒(méi)有在網(wǎng)絡(luò)方面連接聊天服務(wù)器,此時(shí)這個(gè)Entity實(shí) 際上是不可用的,因?yàn)樗鼰o(wú)法用于發(fā)送消息。這個(gè)時(shí)候我們標(biāo)志該實(shí)體的狀態(tài)為非連接狀態(tài)。當(dāng)客戶(hù)端主動(dòng)連接上聊天服務(wù)器后,客戶(hù)端就主動(dòng)發(fā)起修改自己對(duì)應(yīng)的 客戶(hù)端實(shí)體請(qǐng)求,該請(qǐng)求將自己的狀態(tài)修改為連接狀態(tài)。當(dāng)客戶(hù)端關(guān)閉時(shí),聊天服務(wù)器網(wǎng)絡(luò)層接收到連接斷開(kāi)通知,該通知肯定是早于邏輯服務(wù)器發(fā)來(lái)的刪除實(shí)體通 知的,此時(shí)將該客戶(hù)端實(shí)體狀態(tài)修改為斷開(kāi)狀態(tài),并在接收到邏輯服務(wù)器刪除實(shí)體通知時(shí)將其真正刪除。這里展示的這種狀態(tài)修改策略,實(shí)際上在整個(gè)系統(tǒng)中是非常 重要的。它用于指導(dǎo)網(wǎng)絡(luò)連接和上層邏輯之間的關(guān)系,因?yàn)檎麄€(gè)聊天系統(tǒng)中,各個(gè)進(jìn)程的狀態(tài)是不可預(yù)料的(隨時(shí)可能宕掉),當(dāng)某個(gè)進(jìn)程尤其是邏輯服務(wù)器宕掉 后,聊天服務(wù)器是得不到任何正常邏輯通知的,它只能得到網(wǎng)絡(luò)連接的通知。

總結(jié)

整個(gè)系統(tǒng)實(shí)現(xiàn)下來(lái),實(shí)際上是非常簡(jiǎn)單的,代碼量也很少。當(dāng)然還有很多細(xì)節(jié)問(wèn)題,例如聊天信息中攜帶物品信息,這涉及到異步預(yù)處理聊天內(nèi)容,這里就不 方便細(xì)說(shuō)了。

原文地址: 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) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): game develop

評(píng)論

# re: MMO聊天服務(wù)器設(shè)計(jì) 2012-08-29 12:29 飯中淹

感覺(jué)過(guò)于強(qiáng)調(diào)實(shí)體,反而讓概念顯得不清楚了,屬于過(guò)度抽象。
從現(xiàn)實(shí)來(lái)講
頻道和聊天者的概念會(huì)比較清晰一點(diǎn)。  回復(fù)  更多評(píng)論   

# re: MMO聊天服務(wù)器設(shè)計(jì) 2012-08-30 21:26 畢達(dá)哥拉斯半圓

同意樓上,不管什么實(shí)體,映射到Chat-Server上某個(gè)channel的就可以了,話(huà)說(shuō),我也想有個(gè)ChatServer做一些事情,不過(guò)目前的想法是基于Irc server/client改一改,感覺(jué)這樣比較簡(jiǎn)單且快速一點(diǎn)。  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            麻豆精品网站| 亚洲视频在线观看一区| 欧美a级片网| 午夜久久资源| 亚洲一区二区毛片| 一本久久综合亚洲鲁鲁五月天 | 午夜精品福利在线观看| 亚洲一区二区三区四区中文 | 亚洲一区二区三区视频播放| 亚洲少妇在线| 久久精品99国产精品日本| 久久精品国产亚洲精品| 欧美成人精品福利| 欧美午夜精品理论片a级大开眼界| 国产精品家教| 亚洲国产乱码最新视频| 亚洲一区观看| 欧美第一黄色网| 一区二区三区四区在线| 欧美伊人久久大香线蕉综合69| 久久久国产精品亚洲一区| 免费在线观看精品| 欧美午夜久久| 在线欧美日韩精品| 亚洲一区二区三区中文字幕在线| 久久久国产视频91| 亚洲经典自拍| 中文在线一区| 久久综合伊人77777| 欧美日一区二区在线观看| 国产一区二区毛片| 一本到高清视频免费精品| 亚洲欧美在线磁力| 亚洲国产成人av好男人在线观看| 亚洲在线中文字幕| 美女主播精品视频一二三四| 欧美日韩一区三区四区| 在线精品国产成人综合| 午夜视频在线观看一区二区三区| 亚洲电影免费观看高清完整版在线观看 | 欧美jizz19性欧美| 亚洲欧美日韩在线不卡| 国产裸体写真av一区二区| 你懂的国产精品永久在线| 国产精品久久久久一区二区三区 | 欧美日韩国产成人在线免费| 韩国欧美一区| 欧美在线播放高清精品| 99视频精品免费观看| 另类尿喷潮videofree| 国产性天天综合网| 亚洲欧美日本另类| 亚洲伦理精品| 欧美精品乱人伦久久久久久| 在线观看久久av| 久久av一区二区三区亚洲| 国产精品99久久久久久久vr| 欧美日韩国产精品| 日韩一级大片| 亚洲精品视频在线| 欧美日本不卡| 亚洲视频第一页| 99精品国产99久久久久久福利| 欧美国产日本韩| 亚洲欧洲另类| 亚洲精品久久久久| 欧美日韩视频在线观看一区二区三区| 最新国产の精品合集bt伙计| 欧美成人中文| 欧美精品性视频| 亚洲视频视频在线| 亚洲一级黄色av| 国产日韩av在线播放| 久久久999| 欧美 日韩 国产 一区| 亚洲理伦电影| 亚洲视频香蕉人妖| 韩日精品视频| 亚洲高清不卡在线| 欧美日本国产视频| 亚洲你懂的在线视频| 欧美一区二区精品在线| 亚洲国产精品v| 亚洲精品一区二区网址| 欧美午夜片在线观看| 久久精品综合| 欧美福利电影网| 香港久久久电影| 另类酷文…触手系列精品集v1小说| 日韩视频一区二区三区在线播放 | 久久影视精品| 国产精品99久久久久久宅男| 亚洲综合日韩在线| 亚洲国产另类久久精品| 一区二区三区精品国产| 国产亚洲福利一区| 亚洲第一区中文99精品| 国产精品国产a级| 久久久久国色av免费看影院 | 美女网站在线免费欧美精品| 亚洲欧洲日夜超级视频| 一区二区高清在线观看| 狠狠色狠色综合曰曰| 日韩亚洲综合在线| 在线观看精品一区| 亚洲一区二区免费| 日韩网站在线| 久久久久国产精品一区三寸| 9l国产精品久久久久麻豆| 午夜视频在线观看一区二区| 亚洲每日更新| 久久九九久精品国产免费直播| 99在线精品免费视频九九视| 久久精品视频亚洲| 亚洲欧美制服另类日韩| 欧美成人午夜视频| 久久女同互慰一区二区三区| 国产精品v欧美精品v日本精品动漫| 久久综合久久综合久久综合| 国产精品av免费在线观看| 欧美激情无毛| 亚洲成人在线视频播放| 篠田优中文在线播放第一区| 一区二区欧美在线| 免费一级欧美片在线播放| 久久久久国产精品一区三寸| 国产精品久久久久aaaa九色| 亚洲精品国产系列| 亚洲第一二三四五区| 欧美一区二区三区免费看| 亚洲欧美久久久久一区二区三区| 欧美美女操人视频| 亚洲欧洲一区二区天堂久久 | 久久激情一区| 国产精品卡一卡二| 一区二区三区日韩精品视频| 一区二区av在线| 欧美国产一区二区三区激情无套| 嫩草成人www欧美| 在线国产精品播放| 久久综合色播五月| 欧美国产在线观看| 亚洲人成亚洲人成在线观看| 免费在线观看一区二区| 亚洲电影在线播放| 日韩视频不卡| 国产精品地址| 午夜伦欧美伦电影理论片| 久久福利一区| 在线播放亚洲| 欧美精品福利在线| 一本色道久久88综合日韩精品 | 一区二区在线观看av| 久久高清一区| 欧美激情在线观看| 一本一道久久综合狠狠老精东影业| 欧美h视频在线| 亚洲美女精品成人在线视频| 亚洲宅男天堂在线观看无病毒| 国产精品日本| 羞羞色国产精品| 欧美超级免费视 在线| 亚洲日本理论电影| 久久免费高清视频| 99热在线精品观看| 午夜在线a亚洲v天堂网2018| 久久久天天操| 中文久久精品| 亚洲欧美另类中文字幕| 亚洲成人在线视频网站| 亚洲综合第一页| 噜噜噜在线观看免费视频日韩| 国产综合色产在线精品| 亚洲国产一区二区精品专区| 欧美大片专区| 欧美大片一区二区| 亚洲精选91| 国产精品色午夜在线观看| 久久国产精品色婷婷| 欧美激情精品久久久久| 亚洲一区二区伦理| 国产欧美日韩精品专区| 欧美xart系列高清| 一本大道久久a久久精二百| 久久久国产精品亚洲一区| 国产伊人精品| 日韩午夜视频在线观看| 亚洲一区免费视频| 伊人久久成人| 国产精品黄视频| 美乳少妇欧美精品| 亚洲欧美一区二区三区久久| 亚洲成人资源网| 欧美影视一区| 中文精品视频| 亚洲精品欧美| 黄网站色欧美视频| 国产精品久久久久免费a∨ | 老色批av在线精品| 亚洲图片欧美日产|