• <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 的專欄

            [T] ICE實例學習:Let's Chat! 節譯 (1)

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

            需求

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

            設計

                  在本文中,將會演示多種客戶端的設計和實現。包括:
                  1)C++命令行客戶端;
                  2)JAVA SWing GUI客戶端;
                  3).NET WPF客戶端;
                  4)PHP網頁客戶端;
                  5)Silverlight 網頁客戶端;
                 
                 注意,對于ICE3.3, PHP和Ruby只提供了客戶端的Run Time。我們在考慮當連接的客戶如何從服務器獲得消息時,必須要想到這一點。對于消息發布,有兩種通信模型:
                 1)推模型:略
                 2)拉模型:略
                 推模型比較簡單,容易實現,我們的Chat 客戶端中,C++,Java, .Net, Silverlight(0.3)都使用該模型。PHP客戶端使用拉模型。

            推模型定義
                 每個客戶端中提供一個 ChatRoomCallback 類型的ICE對象到服務器。當發生事件時,服務器調用該對象的操作通知客戶。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)當用戶首次連接到聊天室時,服務器調用 init 操作.     users參數告訴用戶目前連接到聊天室的所有用戶信息。
                 2)有用戶連接到聊天室時,服務器調用 join 操作。
                 3)有用戶斷開連接時,服務器調用 leave 操作。
                 4)有用戶發送消息時,服務器調用 send 操作。
                 注意設計使用異步事件。元數據指令 ["ami"] 標明服務器異步調用回調操作。當客戶端行為異常時,這對服務器是一個保護:客戶端可能長時間阻塞,服務器調用期間不會因此失去對線程的控制。

            與防火墻協作
                  略......

                  Glacer2是ICE針對這種情況的預建的解決方案,它扮演一個服務器前端。Glacer2具有以下特征:
                  1)支持會話概念,API支持認證機制,可實現自定義的會話創建和認證。
                  2)單個Glacer2可進行任意數量的服務器和客戶端轉發。服務器只要有一個端口接受外來連接,而不用管具體服務器個數。
                 3)對于具有防火墻的客戶端,服務器也可調用其提供的回調。

                 因為 Glacer2會話概念是面向連接的,只有當客戶端同Glacer2的連接打開時,更精確的說,同Glacer2保持一個激活的會話時,服務器才可以對客戶進行回調。換句話說,當客戶端同Glacer2失去連接,Glacer2自動銷毀會話。為了阻止客戶端到Glacer2的連接被意外關閉,客戶端必須要禁用ACM(Automic Connection Management, 自動連接管理)。而且,Glacer2通常對長時間空閑的會話設置超時。當聊天室長時間沒有動作時,為了防止Glacer2銷毀會話,客戶端必須周期性進行激活,比如,調用 ice_ping, 來對Glacer2的會話超時進行重置。

                 Chat客戶端通過服務器提供的 ChatSession接口來和服務器通信。 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客戶端調用ChatSession的send來發送消息,服務器調用每一個客戶的ChatRoomCallback的send操作進行分發。

            拉模型定義

            TODO


            posted on 2009-03-25 23:52 eXile 閱讀(2220) 評論(0)  編輯 收藏 引用 所屬分類: 網絡開發 、ICE

            導航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿(18)

            隨筆分類

            隨筆檔案

            服務器編程

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲综合久久久| 久久WWW免费人成一看片| 亚洲国产成人久久精品影视| 精品久久久久久99人妻| 久久经典免费视频| 四虎国产精品免费久久5151| 久久笫一福利免费导航| 久久99精品国产自在现线小黄鸭| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 国产福利电影一区二区三区久久久久成人精品综合 | 久久亚洲精品中文字幕| 国产精品成人无码久久久久久| 中文字幕乱码人妻无码久久| 国内精品欧美久久精品| 国产亚洲综合久久系列| 久久AV无码精品人妻糸列| 久久99国产一区二区三区| 2020久久精品国产免费| 亚洲精品乱码久久久久久久久久久久 | 影音先锋女人AV鲁色资源网久久| 国产国产成人久久精品 | 97久久精品人人澡人人爽| 狠狠色婷婷久久综合频道日韩| 久久久久综合国产欧美一区二区| 国产精品免费福利久久| 色欲久久久天天天综合网精品| 中文精品99久久国产| 日韩中文久久| 一级做a爰片久久毛片免费陪| 久久久久国产一区二区三区| 国产精品久久永久免费| 狠狠色婷婷久久一区二区| 久久精品国产亚洲av麻豆蜜芽| 国产精品99久久久精品无码| 无码任你躁久久久久久| 久久午夜福利电影| 免费久久人人爽人人爽av| 国产成人久久精品一区二区三区 | 亚洲综合伊人久久综合| 久久天天躁狠狠躁夜夜网站| 少妇内射兰兰久久|