• <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>
            隨筆 - 6  文章 - 11  trackbacks - 0
            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(1)

            隨筆檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

              在C/S結構的C++網絡程序中,直接采用Socket API進行開發效率是很低的,所以大家發明了各種各樣的網絡框架,如Boost.Aiso和ACE,簡化了網絡通信開發的難度。
              但是這種基于數據包收發的模式還是不太方便,于是又出現了RPC、DCOM、CORBA等遠程接口調用的標準。客戶端只需要像調用本地函數一樣調用遠程接口,框架會自動處理數據包收發,請求和應答等底層細節。
              雖然現在Web技術的發展如火如荼,大有取代C/S架構應用之勢,但是,直接運行于操作系統平臺上的C++原生應用還是有它存在的意義,最主要的方面就是接近系統底層,對操作系統資源和底層設備的控制等,其他任何虛擬機上的中間語言是無法望其項背的。

              CORBA是一個為簡化跨平臺應用而提出的規范,它獨立于網絡協議、編程語言和軟硬件平臺,支持異構的分布式計算環境和不同編程語言間的對象重用。CORBA可以作為不同平臺應用間信息傳遞的中間件,CORBA通過引入經過充分驗證的有效的框架結構和通信手段,最大限度地簡化了網絡通信相關應用的設計與開發,使得我們可以專注于業務邏輯的實現,而無需關心通信的細節。CORBA曾在無數文章中被稱作“軟總線”,以表明它作為數據傳遞通道的基本特性。
              現在存在眾多CORBA實現,既有商用的ORBacus、VisiBroker,也有一些優秀的開源實現,如:TAO、omniORB、MICO等。由于各實現遵從相同的規范,接口基本一致,所以在熟練應用一種CORBA實現后,轉而使用其它實現時,一般不會存在太大的障礙。
              TAO(The ACE ORB)是美國華盛頓大學的Douglas C. Schmidt教授領導開發的一個實時CORBA平臺,它是一個免費的開放源碼項目,用C++語言開發,符合CORBA2.6規范。
              支持語言: C++
              支持平臺: Win32,常見的各種Unix/Linux,實時操作系統如VxWorks等等。在所有的CORBA實現中,TAO支持的平臺是最多的。
              支持的服務: Naming、Event、Notification、Security、Time、Scheduling、Logging、Lifecycle、Trading、Concurrency、Lifecycle、A/V Streaming、Load balancing等。

              在日常工作中我們經常使用的服務就是Naming服務和Notification服務了。Naming服務讓你可以把自己的遠程對象注冊到一個索引服務中,使用者通過友好的注冊名即可找到提供服務的對象,而不用關心這個對象運行在那臺機器上。Notification服務給客戶端提供了主動推送消息的機制,而不需要客戶端不斷查詢是否有自己感興趣的消息。
              那么在CORBA中客戶端和服務端通過什么方式約定雙方的通訊協議呢?這就是IDL語言的功勞了,IDL以一種通用的方式為C/S雙方提供了接口的描述,語法非常類似于C++或Java的類的描述。CORBA提供了專門的工具用來把IDL語言編寫的接口文件編譯成C++或Java能夠理解的樁和框架類,服務端基于IDL編譯器生成的“框架”添加服務實現,客戶端調用IDL編譯器生成的“樁”調用遠程服務的接口,雙方都不需要關心對方內部如何實現,通信數據包格式等問題,IDL會為你搞定一切。
              百聞不如一見,通過一個真實的IDL文件例子,看一下接口的定義到底是如何工作的:  

             1 #ifndef ScriptManageService_h__
             2 #define ScriptManageService_h__
             3 
             4 #include "ALEE_ScriptManageDefines.idl"
             5 
             6 module alee {
             7 module ScriptManage {
             8 
             9     //////////////////////////////////////////////////////////////////////////
            10     // 腳本管理服務
            11     //////////////////////////////////////////////////////////////////////////
            12     interface ALEE_ScriptManageService {
            13 
            14         // 獲取事件類型列表
            15         boolean apiGetEventTypes( out EventTypeList_t list );
            16 
            17         // 列出所有腳本
            18         boolean apiGetScriptList( out ScriptList_t list);
            19 
            20         // 獲取腳本信息
            21         boolean apiGetScriptInfo( in long ID, out ScriptInfo_t info );
            22 
            23         // 保存腳本,ID>0時修改,ID=0時新增,返回新增的ID或原有ID
            24         boolean apiSetScriptInfo( in long ID, in ScriptInfo_t info );
            25 
            26         // 刪除腳本
            27         boolean apiDeleteScript( in long ID );
            28     };
            29 
            30 };
            31 };
            32 
            33 #endif // ScriptManageService_h__
            34 

              從這個IDL文件中可以看出,這個名為“腳本管理服務”的接口interface ALEE_ScriptManageService中定義了5個方法,調用IDL編譯器編譯后,生成了下面的6個文件,其中前3個是客戶端的“樁”,后3個是服務端的“框架”。

              然后,就需要我們來實現服務端的接口了,在ALEE_ScriptManageServiceS.h文件中IDL編譯器生成了一個C++的類class ALEE_ScriptManageService,其中包含的幾個純虛函數就是我們定義的IDL接口方法。

             1 namespace POA_alee
             2 {
             3   namespace ScriptManage
             4   {
             5     class UBISALEE_API ALEE_ScriptManageService
             6       : public virtual PortableServer::ServantBase
             7     {
             8     protected:
             9       ALEE_ScriptManageService (void);
            10     
            11     public:
            12       ALEE_ScriptManageService (const ALEE_ScriptManageService& rhs);
            13       virtual ~ALEE_ScriptManageService (void);
            14       
            15       virtual ::CORBA::Boolean apiGetEventTypes (::alee::ScriptManage::EventTypeList_t_out list) = 0;
            16       virtual ::CORBA::Boolean apiGetScriptList (::alee::ScriptManage::ScriptList_t_out list) = 0;
            17       virtual ::CORBA::Boolean apiGetScriptInfo (::CORBA::Long ID,::alee::ScriptManage::ScriptInfo_t_out info) = 0;
            18       virtual ::CORBA::Boolean apiSetScriptInfo (::CORBA::Long ID,const ::alee::ScriptManage::ScriptInfo_t & info) = 0;
            19       virtual ::CORBA::Boolean apiDeleteScript (::CORBA::Long ID) = 0;
            20     };
            21   } // module alee::ScriptManage
            22 // module alee
            23 

              我們要實現這個接口,就需要添加一個子類繼承這個接口類:
             1 
             2 class ALEE_ScriptManageService_i : public POA_alee::ScriptManage::ALEE_ScriptManageService
             3 {
             4     ORB_Objects &       m_orb;
             5     ALEE_DataBase_Impl &m_dat;
             6     ALEE_ScriptList_t & m_scripts;
             7 
             8 public:
             9     ALEE_ScriptManageService_i(ORB_Objects &orb,ALEE_DataBase_Impl &dat,ALEE_ScriptList_t & scripts);
            10     ~ALEE_ScriptManageService_i(void);
            11 
            12     virtual CORBA::Boolean apiGetEventTypes(EventTypeList_t_out list);
            13     virtual CORBA::Boolean apiGetScriptList(ScriptList_t_out list);
            14     virtual CORBA::Boolean apiGetScriptInfo(CORBA::Long ID,ScriptInfo_t_out info);
            15     virtual CORBA::Boolean apiSetScriptInfo(CORBA::Long ID,const ScriptInfo_t & info);
            16     virtual CORBA::Boolean apiDeleteScript (CORBA::Long ID);
            17 };
            18 

              具體實現方法不必多言,就像寫一個普通的C++類一樣即可。我們關心的問題是服務類寫好了,客戶端如何知道這個類在哪里?
              下面就需要把我們的接口實現注冊到Naming服務中,ORB_Objects類是一個ORB對象的封裝類,是為了方便而把ORB下文相關的對象都放在了一起,暫時把它當成是個ORB的句柄,負責與軟總線ORB通訊即可。
             1 
             2 #define SERVICE_NAME "ALEE_ScriptManageService"
             3 
             4 ALEE_ScriptManageService_i::ALEE_ScriptManageService_i(ORB_Objects &        orb,
             5                                                        ALEE_DataBase_Impl & dat,
             6                                                        ALEE_ScriptList_t &  scripts) :
             7 m_orb(orb),
             8 m_dat(dat),
             9 m_scripts(scripts)
            10 {
            11     m_orb.rebind_name(SERVICE_NAME,_this());
            12 }
            13 
              m_orb是在服務端啟動時初始化的一個ORB_Objects實例,在創建“腳本管理服務”時通過構造函數傳入了一個引用,在服務類實例化時,調用m_orb把自己注冊到Naming服務里,這樣客戶端就可以通過訪問名字服務知道我們的服務所在的位置。

              上手了CORBA之后,才發現自己原來設想的C++實現遠程服務對象調用(http://www.shnenglu.com/cppx/archive/2009/07/22/90820.html)實在是原始而又弱智的夢囈。
              先寫到這里吧,關于客戶端調用的方法,下回分解! 
            posted on 2011-02-16 19:54 風雷九州 閱讀(3904) 評論(0)  編輯 收藏 引用
            亚洲精品国精品久久99热| 久久不射电影网| av国内精品久久久久影院| 久久亚洲AV无码精品色午夜麻豆| 久久精品国产99久久丝袜| 99久久国产综合精品五月天喷水| 欧美精品一区二区精品久久| 91精品婷婷国产综合久久| 国产精品九九久久免费视频 | 精品久久久久久无码专区不卡 | 国产激情久久久久影院| 国产69精品久久久久9999| 国产精品丝袜久久久久久不卡| 国产免费福利体检区久久| 热综合一本伊人久久精品| 伊人久久综合成人网| 粉嫩小泬无遮挡久久久久久| 国产999精品久久久久久| 亚洲乱码日产精品a级毛片久久| 久久99热这里只频精品6| 久久久久久久久久久久中文字幕 | 久久人人爽人人爽人人片AV东京热| 久久精品国产精品亚洲精品| 99久久精品国内| 日日狠狠久久偷偷色综合0| 亚洲精品乱码久久久久久久久久久久 | 亚洲愉拍99热成人精品热久久| 国产精品免费福利久久| 久久www免费人成精品香蕉| 久久久精品人妻一区二区三区蜜桃| 99久久99久久久精品齐齐| 亚洲国产成人精品久久久国产成人一区二区三区综 | 色婷婷综合久久久久中文字幕| 天堂久久天堂AV色综合| 久久精品国产99久久丝袜| 成人免费网站久久久| A级毛片无码久久精品免费| 久久久久噜噜噜亚洲熟女综合| 狼狼综合久久久久综合网| 久久精品桃花综合| 欧美亚洲另类久久综合|