• <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>
            posts - 2,  comments - 25,  trackbacks - 0
             

            ICE Service使用方法簡介

            最近研究了一下網絡通信中間件ICE的使用,粗通其皮毛,按照官方手冊依葫蘆畫瓢寫了一個程序員都喜聞樂見的“Hello World”程序,服務端和客戶端均用C++開發,通訊協議使用默認的TCP。感覺ICE的大致好處有以下兩點:

            1.       平臺無關性。無論客戶端或者服務端均可用現在流行的開發語言(C++ /JAVA/C#/php)進行開發,并且屏蔽語言差異性。現在比較流行的方式是客戶端用C#開發,與用C++開發的服務端直接通訊。

            2.         通訊協議多樣性?,F在可選擇TCPUDP、HTTP進行通訊,如果對安全要求較高,可選擇SSL對傳輸的數據進行加密。

            另外ICE還提供一些擴展組件,實現網絡通訊的負載均衡(ICEGrid,通訊節點統一管理(ICEBOX),程序自動更新(ICEPatch)等,方便應用擴展。

            如果使用過ICE的人都知道,在實現服務端或者客戶端的時候通常都要寫一些“公式化”的代碼,負責Ice通信器初始化、異常捕獲,以及應用終止后的銷毀。如下所示:

             1int status=0;
             2
             3     Ice::CommunicatorPtr ic;
             4
             5     try
             6
             7     {
             8
             9         ic = Ice::initialize(argc,argv);
            10
            11         Ice::ObjectAdapterPtr adapter = 
            12
            13         ic->createObjectAdapterWithEndpoints("SayHelloAdapter","tcp -h 127.0.0.1 -p 10000");
            14
            15         Ice::ObjectPtr object = new HelloICEI;
            16
            17        adapter->add(object,ic->stringToIdentity("SimpleHello"));
            18
            19        adapter->activate();
            20
            21         ic->waitForShutdown();
            22
            23     }

            24
            25     catch (const Ice::Exception & e)
            26
            27     {
            28
            29         cerr << e << endl;
            30
            31         status = 1;
            32
            33     }
             
            34
            35     catch (const char * msg) 
            36
            37     {
            38
            39         cerr << msg << endl;
            40
            41         status = 1;
            42
            43     }

            44
            45     if ( ic ) 
            46
            47     {
            48
            49         try 
            50
            51         {
            52
            53              ic->destroy();//關閉ICE
            54
            55         }

            56
            57         catch (const Ice::Exception & e)
            58
            59         {
            60
            61              cerr << e << endl;
            62
            63              status = 1;
            64
            65         }

            66
            67}

            68
            69



            如果每次都要寫這么多的話,第一浪費時間和精力,第二不能將注意力集中到業務邏輯上。還有一點就是對代碼的整潔和易讀方面做的不夠好(本人略微有些代碼“潔癖”)。

            閱讀官方手冊,發現ICE提供兩個工具類封裝了這些“公式化”邏輯,分別是“Application”和“Service”。

            Ice::Application本身是一個抽象類,其run()函數為純虛函數,因此必須被繼承后使用。

            Ice::Application 是一個單體(singleton)類,會創建單個通信器。如果你要使用多個通信器,不能使用Ice::Application來定義多個App。而至多定義一個App的實例。

            其它通信器需要使用Ice::initialize()手工生成。

            一般而言,Ice::Application 類對于Ice 客戶和服務器來說已經非常方便,但在有些情況下,應用可能需要作為Unix 看守(daemon)或Win32 服務運行在系統一級。對于這樣的情況,Ice 提供了Ice::Service。一個可與Ice::Application 相比的單體類,但它還封裝了低級的、 針對特定平臺的初始化和關閉步驟――系統服務常常需要使用這樣的步驟。

            下面介紹Ice::Service的使用方法,僅介紹開發步驟,后面附上具體例子下載。

            1. 需要在服務端中引用Ice/Service.h頭文件。本人曾在此浪費了2個小時。

            2. 新建一個類繼承Ice::Service,并實現其中的三個虛函數。代碼如下:

             

             1class MyService : public Ice::Service
             2
             3{
             4
             5protected:
             6
             7virtual bool start(intchar *[],int&);
             8
             9virtual bool stop();
            10
            11virtual void interrupt();
            12
            13private:
            14
            15Ice::ObjectAdapterPtr m_adapter;
            16
            17}
            ;
            18
            19void MyService::interrupt()
            20
            21{
            22
            23std::cout << "Receive signal " << std::endl;
            24
            25Ice::Service::interrupt();
            26
            27}

            28
            29bool MyService::stop()
            30
            31{
            32
            33std::cout << "Stop running " << std::endl;
            34
            35return true;
            36
            37}

            38
            39bool MyService::start(int argc, char * argv[],int& status)
            40
            41{
            42
            43std::string endpoint = "tcp -h localhost -p 10000";
            44
            45m_adapter = communicator()->createObjectAdapterWi thEndpoints("SimpleHelloAdapter", endpoint);
            46
            47Ice::ObjectPtr object = new HelloICEI;
            48
            49m_adapter->add(object,communicator()->stringToIdentity("SimpleHello"));
            50
            51m_adapter->activate();
            52
            53return true;
            54
            55}

            56
            57


              3.   在main函數中啟動服務。此處需要注意對于服務來說最常見的有安裝服務、卸載服務、啟動服務、停止服務四個操作。這四個操作分別通過啟動參數來控制。以Win32平臺為例:

            --service NAME

            作為名叫NAME 的Windows 服務啟動。在傳給start 成員函數的參數向量中,這個選項會被移除。

            但是,在應用作為Windows 服務運行之前,它必須先被安裝,因此,Ice::Service 類還支持另外一些的命令行選項,用于執行管理活動:

            --install NAME [--display DISP] [--executable EXEC][ARG ...]

            安裝NAME 服務。如果指定了--display 選項,就把DISP 用作服務的顯示名,否則就使用NAME。如果指定了--executable 選項,就把EXEC 用作服務的可執行路徑名,否則就使用可執行文件的路徑名來調用--install。其他任何參數都會不加改變地傳給Service::start 成員函數。注意,在啟動時傳給服務的參數集中,這個命令會自動增加命令行參數--service NAME,因此,你不需要顯式地指定這些選項。

            --uninstall NAME

            移除NAME 服務。如果服務目前是活動的,在反安裝之前,必須先使它停止。

            --start NAME [ARG ...]

            啟動NAME 服務。其他任何參數都會不加改變地傳給Service::start 成員函數。    

            --stop NAME

            停止NAME 服務。如果指定的管理命令不止一個,或者在使用--service 的同時還使用了管理命令,就會發生錯誤。在執行了管理命令之后,程序會立即終止。Ice::Service 類支持Windows 服務控制代碼SERVICE_CONTROL_INTERROGATE 和SERVICE_CONTROL_STOP。在收到SERVICE_CONTROL_STOP 時,Ice::Service 會調用shutdown 成員函數。

            在Visual Studio中設置啟動參數—install MyService,可在系統服務中注冊名為“MyService”的服務。



            啟動服務端程序可以在系統服務列表中看到MyService已經作為服務注冊進去了。



            4. 至此ICE的服務端即可作為系統服務的形式存在與客戶端進行通訊了。

            示例代碼下載 

            posted on 2011-07-10 13:10 三夏健 閱讀(1973) 評論(3)  編輯 收藏 引用 所屬分類: ICE
            久久久久99这里有精品10| 久久国产精品久久| 91麻豆国产精品91久久久| 午夜精品久久久久| 亚洲AV乱码久久精品蜜桃| 久久久久久免费一区二区三区 | 国产亚州精品女人久久久久久 | 青青草原精品99久久精品66| 久久精品国产亚洲AV嫖农村妇女| 欧美伊香蕉久久综合类网站| 色播久久人人爽人人爽人人片aV| 久久无码AV一区二区三区| 狠狠色丁香婷综合久久| 久久综合久久美利坚合众国| 国产亚洲欧美成人久久片| 久久综合九色综合网站| 久久综合九色综合欧美就去吻| 亚洲中文字幕久久精品无码APP| 青青草原综合久久| 久久综合给久久狠狠97色| 蜜臀久久99精品久久久久久| 国产精品免费看久久久| 成人综合久久精品色婷婷| 亚洲欧美精品伊人久久| 成人久久综合网| 漂亮人妻被黑人久久精品| 久久午夜免费视频| 久久久久女教师免费一区| 日韩一区二区久久久久久 | 久久男人中文字幕资源站| 久久99精品国产麻豆宅宅| 精品久久无码中文字幕| 性欧美丰满熟妇XXXX性久久久| 色狠狠久久综合网| 一本久久a久久精品综合香蕉| 国产精品久久久久乳精品爆| 成人a毛片久久免费播放| 久久97精品久久久久久久不卡| 久久99国产综合精品免费| 久久久久久久人妻无码中文字幕爆| 99久久这里只精品国产免费|