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

            隨筆檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

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

              在日常工作中我們經(jīng)常使用的服務(wù)就是Naming服務(wù)和Notification服務(wù)了。Naming服務(wù)讓你可以把自己的遠(yuǎn)程對(duì)象注冊(cè)到一個(gè)索引服務(wù)中,使用者通過友好的注冊(cè)名即可找到提供服務(wù)的對(duì)象,而不用關(guān)心這個(gè)對(duì)象運(yùn)行在那臺(tái)機(jī)器上。Notification服務(wù)給客戶端提供了主動(dòng)推送消息的機(jī)制,而不需要客戶端不斷查詢是否有自己感興趣的消息。
              那么在CORBA中客戶端和服務(wù)端通過什么方式約定雙方的通訊協(xié)議呢?這就是IDL語(yǔ)言的功勞了,IDL以一種通用的方式為C/S雙方提供了接口的描述,語(yǔ)法非常類似于C++或Java的類的描述。CORBA提供了專門的工具用來把IDL語(yǔ)言編寫的接口文件編譯成C++或Java能夠理解的樁和框架類,服務(wù)端基于IDL編譯器生成的“框架”添加服務(wù)實(shí)現(xiàn),客戶端調(diào)用IDL編譯器生成的“樁”調(diào)用遠(yuǎn)程服務(wù)的接口,雙方都不需要關(guān)心對(duì)方內(nèi)部如何實(shí)現(xiàn),通信數(shù)據(jù)包格式等問題,IDL會(huì)為你搞定一切。
              百聞不如一見,通過一個(gè)真實(shí)的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     // 腳本管理服務(wù)
            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時(shí)修改,ID=0時(shí)新增,返回新增的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 

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

              然后,就需要我們來實(shí)現(xiàn)服務(wù)端的接口了,在ALEE_ScriptManageServiceS.h文件中IDL編譯器生成了一個(gè)C++的類class ALEE_ScriptManageService,其中包含的幾個(gè)純虛函數(shù)就是我們定義的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 

              我們要實(shí)現(xiàn)這個(gè)接口,就需要添加一個(gè)子類繼承這個(gè)接口類:
             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 

              具體實(shí)現(xiàn)方法不必多言,就像寫一個(gè)普通的C++類一樣即可。我們關(guān)心的問題是服務(wù)類寫好了,客戶端如何知道這個(gè)類在哪里?
              下面就需要把我們的接口實(shí)現(xiàn)注冊(cè)到Naming服務(wù)中,ORB_Objects類是一個(gè)ORB對(duì)象的封裝類,是為了方便而把ORB下文相關(guān)的對(duì)象都放在了一起,暫時(shí)把它當(dāng)成是個(gè)ORB的句柄,負(fù)責(zé)與軟總線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是在服務(wù)端啟動(dòng)時(shí)初始化的一個(gè)ORB_Objects實(shí)例,在創(chuàng)建“腳本管理服務(wù)”時(shí)通過構(gòu)造函數(shù)傳入了一個(gè)引用,在服務(wù)類實(shí)例化時(shí),調(diào)用m_orb把自己注冊(cè)到Naming服務(wù)里,這樣客戶端就可以通過訪問名字服務(wù)知道我們的服務(wù)所在的位置。

              上手了CORBA之后,才發(fā)現(xiàn)自己原來設(shè)想的C++實(shí)現(xiàn)遠(yuǎn)程服務(wù)對(duì)象調(diào)用(http://m.shnenglu.com/cppx/archive/2009/07/22/90820.html)實(shí)在是原始而又弱智的夢(mèng)囈。
              先寫到這里吧,關(guān)于客戶端調(diào)用的方法,下回分解! 
            posted on 2011-02-16 19:54 風(fēng)雷九州 閱讀(3914) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            无码AV中文字幕久久专区| 狠狠88综合久久久久综合网| 久久精品国产99久久久| 中文精品久久久久人妻不卡| 亚洲AV无码久久精品蜜桃| 国产精品9999久久久久| 久久久久亚洲av成人无码电影 | 99久久综合国产精品免费| 久久狠狠爱亚洲综合影院| 青青热久久综合网伊人| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久本道伊人久久| 久久精品综合网| 久久国产精品99精品国产| 一本色综合久久| 久久国产精品免费一区| 国产精品岛国久久久久| 亚洲国产日韩欧美久久| 99久久无色码中文字幕| 国产成年无码久久久免费| a级毛片无码兔费真人久久| 日韩乱码人妻无码中文字幕久久| 精品国产91久久久久久久a| 无码国产69精品久久久久网站| 国产三级精品久久| 久久精品免费一区二区三区| 亚洲AV无码久久精品成人| 久久性生大片免费观看性| 国产亚州精品女人久久久久久| 精品人妻久久久久久888| 久久久亚洲AV波多野结衣| 久久久久无码精品国产app| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久久WWW成人免费毛片| 精品免费久久久久国产一区| 91久久精品视频| 久久99精品久久久久久不卡| 四虎国产精品免费久久5151 | 国产精品无码久久综合网| 好久久免费视频高清| 国产精品久久久久aaaa|