• <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>

            eXile 的專(zhuān)欄

            [T] ICE實(shí)例學(xué)習(xí):Let's Chat! 節(jié)譯 (1)

            節(jié)譯,原文地址:http://www.zeroc.com/articles/index.html

            需求

                  1)一個(gè)典型的聊天室應(yīng)用,使用客戶(hù)器/服務(wù)器架構(gòu),客戶(hù)發(fā)送消息到中心服務(wù)器,然后,消息發(fā)送給其它客戶(hù)。
                  2)盡量減少服務(wù)器管理,甚至可以不需要。
                  3)通信必須安全,通過(guò)公共網(wǎng)絡(luò)時(shí)必須要保護(hù)個(gè)人隱私。
                  4)當(dāng)客戶(hù)端和服務(wù)器有防火墻保護(hù)時(shí)也能正常運(yùn)行,客戶(hù)端不用修改它的網(wǎng)絡(luò)或者防火墻設(shè)置。
                  5)客戶(hù)端可以在各種平臺(tái)上利用多種語(yǔ)言實(shí)現(xiàn),比如說(shuō)利用Web瀏覽器作為客戶(hù)端。
                  6)客戶(hù)端可能網(wǎng)絡(luò)帶寬有限,所以應(yīng)該盡量減少網(wǎng)絡(luò)流量。
                  只支持單個(gè)聊天室。(多個(gè)聊天室只是代碼多了點(diǎn),并沒(méi)有增加任何難度)。

            設(shè)計(jì)

                  在本文中,將會(huì)演示多種客戶(hù)端的設(shè)計(jì)和實(shí)現(xiàn)。包括:
                  1)C++命令行客戶(hù)端;
                  2)JAVA SWing GUI客戶(hù)端;
                  3).NET WPF客戶(hù)端;
                  4)PHP網(wǎng)頁(yè)客戶(hù)端;
                  5)Silverlight 網(wǎng)頁(yè)客戶(hù)端;
                 
                 注意,對(duì)于ICE3.3, PHP和Ruby只提供了客戶(hù)端的Run Time。我們?cè)诳紤]當(dāng)連接的客戶(hù)如何從服務(wù)器獲得消息時(shí),必須要想到這一點(diǎn)。對(duì)于消息發(fā)布,有兩種通信模型:
                 1)推模型:略
                 2)拉模型:略
                 推模型比較簡(jiǎn)單,容易實(shí)現(xiàn),我們的Chat 客戶(hù)端中,C++,Java, .Net, Silverlight(0.3)都使用該模型。PHP客戶(hù)端使用拉模型。

            推模型定義
                 每個(gè)客戶(hù)端中提供一個(gè) ChatRoomCallback 類(lèi)型的ICE對(duì)象到服務(wù)器。當(dāng)發(fā)生事件時(shí),服務(wù)器調(diào)用該對(duì)象的操作通知客戶(hù)。SLICE定義如下:
            // Slice 
            module Chat 

            // Implemented by clients 
            interface ChatRoomCallback 

                [
            "ami"void init(Ice::StringSeq users); 
                [
            "ami"void join(long timestamp, string name); 
                [
            "ami"void leave(long timestamp, string name); 
                [
            "ami"void send(long timestamp, string name, string message); 
            }; 
            };

                 1)當(dāng)用戶(hù)首次連接到聊天室時(shí),服務(wù)器調(diào)用 init 操作.     users參數(shù)告訴用戶(hù)目前連接到聊天室的所有用戶(hù)信息。
                 2)有用戶(hù)連接到聊天室時(shí),服務(wù)器調(diào)用 join 操作。
                 3)有用戶(hù)斷開(kāi)連接時(shí),服務(wù)器調(diào)用 leave 操作。
                 4)有用戶(hù)發(fā)送消息時(shí),服務(wù)器調(diào)用 send 操作。
                 注意設(shè)計(jì)使用異步事件。元數(shù)據(jù)指令 ["ami"] 標(biāo)明服務(wù)器異步調(diào)用回調(diào)操作。當(dāng)客戶(hù)端行為異常時(shí),這對(duì)服務(wù)器是一個(gè)保護(hù):客戶(hù)端可能長(zhǎng)時(shí)間阻塞,服務(wù)器調(diào)用期間不會(huì)因此失去對(duì)線(xiàn)程的控制。

            與防火墻協(xié)作
                  略......

                  Glacer2是ICE針對(duì)這種情況的預(yù)建的解決方案,它扮演一個(gè)服務(wù)器前端。Glacer2具有以下特征:
                  1)支持會(huì)話(huà)概念,API支持認(rèn)證機(jī)制,可實(shí)現(xiàn)自定義的會(huì)話(huà)創(chuàng)建和認(rèn)證。
                  2)單個(gè)Glacer2可進(jìn)行任意數(shù)量的服務(wù)器和客戶(hù)端轉(zhuǎn)發(fā)。服務(wù)器只要有一個(gè)端口接受外來(lái)連接,而不用管具體服務(wù)器個(gè)數(shù)。
                 3)對(duì)于具有防火墻的客戶(hù)端,服務(wù)器也可調(diào)用其提供的回調(diào)。

                 因?yàn)?Glacer2會(huì)話(huà)概念是面向連接的,只有當(dāng)客戶(hù)端同Glacer2的連接打開(kāi)時(shí),更精確的說(shuō),同Glacer2保持一個(gè)激活的會(huì)話(huà)時(shí),服務(wù)器才可以對(duì)客戶(hù)進(jìn)行回調(diào)。換句話(huà)說(shuō),當(dāng)客戶(hù)端同Glacer2失去連接,Glacer2自動(dòng)銷(xiāo)毀會(huì)話(huà)。為了阻止客戶(hù)端到Glacer2的連接被意外關(guān)閉,客戶(hù)端必須要禁用ACM(Automic Connection Management, 自動(dòng)連接管理)。而且,Glacer2通常對(duì)長(zhǎng)時(shí)間空閑的會(huì)話(huà)設(shè)置超時(shí)。當(dāng)聊天室長(zhǎng)時(shí)間沒(méi)有動(dòng)作時(shí),為了防止Glacer2銷(xiāo)毀會(huì)話(huà),客戶(hù)端必須周期性進(jìn)行激活,比如,調(diào)用 ice_ping, 來(lái)對(duì)Glacer2的會(huì)話(huà)超時(shí)進(jìn)行重置。

                 Chat客戶(hù)端通過(guò)服務(wù)器提供的 ChatSession接口來(lái)和服務(wù)器通信。 ChatSession 從Glacer2::Session派生。
            // Slice 
            module Chat 

            exception InvalidMessageException 

                
            string reason; 
            }; 
             
            interface ChatSession extends Glacier2::Session 

                
            void setCallback(ChatRoomCallback* cb); 
                [
            "ami"long send(string message) throws InvalidMessageException; 
            }; 
            };

                  這就是推模型,Chat客戶(hù)端調(diào)用ChatSession的send來(lái)發(fā)送消息,服務(wù)器調(diào)用每一個(gè)客戶(hù)的ChatRoomCallback的send操作進(jìn)行分發(fā)。

            拉模型定義

            TODO


            posted on 2009-03-25 23:52 eXile 閱讀(2235) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 網(wǎng)絡(luò)開(kāi)發(fā)ICE

            導(dǎo)航

            <2008年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            統(tǒng)計(jì)

            常用鏈接

            留言簿(18)

            隨筆分類(lèi)

            隨筆檔案

            服務(wù)器編程

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久se精品一区二区| 久久精品国产亚洲Aⅴ香蕉| 久久久久亚洲AV无码麻豆| 777午夜精品久久av蜜臀| 99久久精品午夜一区二区| 99久久成人18免费网站| 亚洲女久久久噜噜噜熟女| 国产精品VIDEOSSEX久久发布| 久久久国产99久久国产一| 久久99中文字幕久久| 2021久久精品免费观看| 久久免费国产精品一区二区| 久久婷婷五月综合色99啪ak| 久久精品毛片免费观看| 色综合久久久久综合99| 久久精品国产福利国产秒| 精品伊人久久大线蕉色首页| 久久www免费人成精品香蕉| 91精品国产乱码久久久久久| 久久夜色精品国产亚洲| 久久91精品综合国产首页| 91精品国产高清久久久久久国产嫩草| 精品国产乱码久久久久软件| 亚洲人成无码网站久久99热国产 | 国产精品日韩深夜福利久久| 精品久久人妻av中文字幕| 2021国内久久精品| 日韩十八禁一区二区久久| 久久久久九九精品影院| 久久福利青草精品资源站| 久久久女人与动物群交毛片| 久久99精品国产麻豆宅宅| 波多野结衣久久| 欧美亚洲国产精品久久高清| 三级三级久久三级久久| 久久青青色综合| 亚洲AV无码1区2区久久| 热re99久久6国产精品免费| 91精品国产9l久久久久| 国产激情久久久久影院老熟女免费| 久久久久久免费一区二区三区 |