版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
CORBA程序設(shè)計(jì)指南〔入門(mén)〕這里假設(shè)你對(duì)CORBA毫無(wú)所知。對(duì)JAVA略有所知,因?yàn)檫@里使用JAVA作為程序設(shè)計(jì)語(yǔ)言。學(xué)習(xí)了本書(shū),你將對(duì)CORBA有個(gè)初步了解,并能編寫(xiě)一個(gè)簡(jiǎn)單完整的CORBA應(yīng)用程序。CORBA簡(jiǎn)介CORBA〔CommonObjectRequestBrokerArchitecture〕是為了實(shí)現(xiàn)分布式計(jì)算而引入的。為了說(shuō)明CORBA在分布計(jì)算上有何特點(diǎn),我們從它與其它幾種分布計(jì)算技術(shù)的比擬中進(jìn)行說(shuō)明。與過(guò)去的面向過(guò)程的RPC(RemoteProcedureCall)不同,CORBA是基于面向?qū)ο蠹夹g(shù)的,它能解決遠(yuǎn)程對(duì)象之間的互操作問(wèn)題。MicroSoft的DCOM(DistributedComponentObjectModel)也是解決這一問(wèn)題的,但它基于Windows操作系統(tǒng),盡管到本書(shū)編寫(xiě)時(shí),DCOM已有在其他操作系統(tǒng)如SunSolaris,DigitalUnix,IBMMVS上的實(shí)現(xiàn),但毫無(wú)疑問(wèn),只有在微軟的操作系統(tǒng)上才會(huì)實(shí)現(xiàn)得更好。而只有CORBA是真正跨平臺(tái)的,平臺(tái)獨(dú)立性正是CORBA的初衷之一。另一種做到平臺(tái)無(wú)關(guān)性的技術(shù)是JavaRMI〔RemoteMethodInvocation〕,但它只能用JAVA實(shí)現(xiàn)。CORBA與此不同,它通過(guò)一種叫IDL〔InterfaceDefinitionLanguage〕的接口定義語(yǔ)言,能做到語(yǔ)言無(wú)關(guān),也就是說(shuō),任何語(yǔ)言都能制作CORBA組件,而CORBA組件能在任何語(yǔ)言下使用。因此,可以這樣理解CORBA:CORBA一種異構(gòu)平臺(tái)下的語(yǔ)言無(wú)關(guān)的對(duì)象互操作模型。CORBA體系結(jié)構(gòu)CORBA的體系結(jié)構(gòu)如下:圖1.1CORBA體系結(jié)構(gòu)CORBA上的效勞用IDL描述,IDL將被映射為某種程序設(shè)計(jì)語(yǔ)言如C++或Java,并且分成兩分,在客戶方叫IDLStub〔樁〕,在效勞器方叫IDLSkeleton〔骨架〕。兩者可以采用不同的語(yǔ)言。效勞器方在Skeleton的根底上編寫(xiě)對(duì)象實(shí)現(xiàn)(ObjectImplementation),而客戶方要訪問(wèn)效勞器對(duì)象上的方法,那么要通過(guò)客戶樁。而雙方又要通過(guò)而ORB〔ObjectRequestBroker,對(duì)象請(qǐng)求代理〕總線通信。與傳統(tǒng)的Client/Server模式〔我們稱為T(mén)wo-tierclient/server〕不同,CORBA是一種multi-tierclient/serverarchitecture,更確切的說(shuō),是一種three-tierclient/server模式。雙重客戶/效勞器模式存在的問(wèn)題是兩者耦合太緊,它們之間采用一種私有協(xié)議通信,效勞器的改變將影響到客戶方。多重客戶/效勞器與此不同,兩者之間的通信不能直接進(jìn)行,而需要通過(guò)中間的一種叫代理的方式進(jìn)行。在CORBA中這種代理就是ORB。通過(guò)它,客戶和效勞器不再關(guān)心通信問(wèn)題,它們只需關(guān)心功能上的實(shí)現(xiàn)。從這個(gè)意義上講,CORBA是一種中間件(Middleware)技術(shù)。下面列出CORBA中的一些重要概念,或者說(shuō)CORBA中的幾個(gè)重要名詞,有助于讀者了解CORBA的一些重要的方面。CORBA中的幾個(gè)概念1.2.1ORB〔ObjectRequestBroker〕CORBA體系結(jié)構(gòu)的核心就是ORB。可以這樣簡(jiǎn)單理解:ORB就是使得客戶應(yīng)用程序能調(diào)用遠(yuǎn)端對(duì)象方法的一種機(jī)制。圖1.2ORB模型具體來(lái)說(shuō)就是:當(dāng)客戶程序要調(diào)用遠(yuǎn)程對(duì)象上的方法時(shí),首先要得到這個(gè)遠(yuǎn)程對(duì)象的引用,之后就可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程對(duì)象的方法。當(dāng)發(fā)出一個(gè)調(diào)用時(shí),實(shí)際上ORB會(huì)截取這個(gè)調(diào)用〔通過(guò)客戶Stub完成,“提高〞篇中會(huì)詳細(xì)解釋〕,因?yàn)榭蛻艉托谄骺赡茉诓煌木W(wǎng)絡(luò)、不同的操作系統(tǒng)上甚至用不同的語(yǔ)言實(shí)現(xiàn),ORB還要負(fù)責(zé)將調(diào)用的名字、參數(shù)等編碼成標(biāo)準(zhǔn)的方式(稱Marshaling)通過(guò)網(wǎng)絡(luò)傳輸?shù)叫谄鞣健矊?shí)際上在同一臺(tái)機(jī)器上也如此〕,并通過(guò)將參數(shù)Unmarshaling的過(guò)程,傳到正確的對(duì)象上〔這整個(gè)過(guò)程叫重定向,Redirecting〕,效勞器對(duì)象完成處理后,ORB通過(guò)同樣的Marshaling/Unmarshaling方式將結(jié)果返回給客戶。因此,ORB是一種功能,它具備以下能力:1.對(duì)象定位〔根據(jù)對(duì)象引用定位對(duì)象的實(shí)現(xiàn)〕2.對(duì)象定位后,確信Server能接受請(qǐng)求3.將客戶方請(qǐng)求通過(guò)Marshaling/Unmarshing方式重定向到效勞器對(duì)象上4.如果需要,將結(jié)果以同樣的方式返回。1.2.2IDL(InterfaceDefinitionLanguage)IDL,接口定義語(yǔ)言,是CORBA體系中的另一個(gè)重要概念。如果說(shuō)ORB使CORBA做到平臺(tái)無(wú)關(guān),那么IDL,那么使CORBA做到語(yǔ)言無(wú)關(guān)。正像其名字中顯示的那樣,IDL僅僅定義接口,而不定義實(shí)現(xiàn),類似于C中的頭文件。實(shí)際上它不是真正的編程語(yǔ)言。要用它編寫(xiě)應(yīng)用,需要將它映射它相應(yīng)的程序設(shè)計(jì)語(yǔ)言上去,如映射到C++或JAVA上去。映射后的代碼叫ClientStubCode和ServerSkeletonCode。IDL的好處是使高層設(shè)計(jì)人員不必考慮實(shí)現(xiàn)細(xì)節(jié)而只需關(guān)心功能描述。IDL可以說(shuō)是描述性語(yǔ)言。設(shè)計(jì)IDL的過(guò)程也是設(shè)計(jì)對(duì)象模型的過(guò)程。它是編寫(xiě)CORBA應(yīng)用的第一步,在整個(gè)軟件設(shè)計(jì)過(guò)程中至關(guān)重要。IDL的語(yǔ)法很像C++,當(dāng)然也像Java。很難想像一個(gè)程序設(shè)計(jì)人員是不懂C或Java的,所以,幾乎所有的程序設(shè)計(jì)人員都能迅速理解IDL。而這正是IDL設(shè)計(jì)者所希望的。下面是一個(gè)IDL定義的簡(jiǎn)單例子://grid.idl//IDLdefinitionofa2-Dgrid:modulesimpleDemo{interfacegrid{readonlyattributeshortheight;//heightofthegridreadonlyattributeshortwidth;//widthofthegrid//IDLoperations//settheelement[row,col]ofthegrid,tovalue:voidset(inshortrow,inshortcol,inlongvalue);//returnelement[row,col]ofthegrid:longget(inshortrow,inshortcol);};};ThisIDLdefinesaninterfaceforagridCORBAobjectthatmaintainsagridor2-Darrayofdatavalues,whichaclientcanaccessormodifyremotely.Module類似于Java中包〔Package〕的概念,實(shí)際上modulesimpleDemo映射到JAVA正是packagesimpleDemo。而Interface類似于C++中的類〔classs〕聲明,或是Java中的Interface定義。附錄中列出了IDL的全部語(yǔ)法。1.2.3StubCode和SkeletonCodeStubcode和SkeletonCode是由IDLComplier自動(dòng)生成的,前者放在客戶方,后者放在效勞器方。不同廠商的IDLcomplier生成的Stub和Skeleton會(huì)略有區(qū)別,但影響不大。如上面的grid.idl,編譯后,StubCode包含以下文件:grid.java_gridStub.javagridHelper.javagridHolder.javagridOperations.javaSkeletonCode那么包含以下文件:gridOperations.javagridPOA.javagridPOATie.java〔在StudCode也包含gridOperations.java,是因?yàn)樵谑褂肅allback機(jī)制時(shí)會(huì)用到。〕這些文件的用途后面會(huì)講到。1.2.4GIOP和IIOP我們知道,客戶和效勞器是通過(guò)ORB交互的,那么,客戶方的ORB和效勞器方的ORB又是通過(guò)什么方式通信呢?通過(guò)GIOP(GeneralInter-ORBProtocol)。也就是說(shuō),GIOP是一種通信協(xié)議,它規(guī)定了兩個(gè)實(shí)體:客戶和效勞器ORBs間的通信機(jī)制。圖1.3ORBs通信機(jī)制GIOP在設(shè)計(jì)時(shí)遵循以下目標(biāo):WidestpossibleavailabilitySimplicityScalabilityLowcostGeneralityArchitecturalneutrality也是說(shuō),GIOP設(shè)計(jì)的盡可能簡(jiǎn)單,開(kāi)銷(xiāo)最小,同時(shí)又具有最廣泛的適應(yīng)性和可擴(kuò)展性,以適應(yīng)不同的網(wǎng)絡(luò)。GIOP定義了以下幾個(gè)方面:1.TheCommonDataRepresentation(CDR)definition.通用數(shù)據(jù)表示定義。它實(shí)際上是IDL數(shù)據(jù)類型在網(wǎng)上傳輸時(shí)的編碼方案。它對(duì)所有IDL數(shù)據(jù)類型的映射都作了規(guī)定。2.GIOPMessageFormats.它規(guī)定了Client和Server兩個(gè)角色之間要傳輸?shù)南⒏袷?。主要包括Request和Reply兩種消息。一個(gè)Request消息有以下幾局部組成:AGIOPmessageheaderARequestHeaderTheRequestBody相應(yīng)的,一個(gè)Reply消息那么包括AGIOPmessageheaderAReplyHeaderTheReplyBodyGIOP1.1規(guī)定GIOPmessageheader格式如下://GIOP1.1structMessageHeader_1_1{charmagic[4];VersionGIOP_version;octetflags;//GIOP1.1changeoctetmessage_type;unsignedlongmessage_size;};RequestHeader格式如下://GIOP1.1structRequestHeader_1_1{IOP::ServiceContextListservice_context;unsignedlongrequest_id;booleanresponse_expected;octetreserved[3];//AddedinGIOP1.1sequence<octet>object_key;stringoperation;Principalrequesting_principal;};RequestBody那么按CDR規(guī)定的方式編碼,它主要對(duì)方法調(diào)用的參數(shù)進(jìn)行編碼,如方法:doubleexample(inshortm,inoutPrincipalp);可表示成:structexample_body{shortm;//leftmostinorinoutparameterPrincipalp;//...totherightmost};3.GIOPTransportAssumptions:主要規(guī)定在任何面向連接的網(wǎng)絡(luò)傳輸層上的一些操作規(guī)那么。如:Asymmetricalconnectionusage,Requestmultiplexing,Overlappingrequests,Connectionmanagement等。另外,因?yàn)镃ORBA是基于對(duì)象的,GIOP還需定義一套ObjectLocation的機(jī)制。GIOP因?yàn)槭且环N通用協(xié)議,所以不能直接使用。在不同的網(wǎng)絡(luò)上需要有不同的實(shí)現(xiàn)。目前使用最廣的便是Internet上的GIOP,稱為IIOP〔InternetInter-ORBProtocol〕。IIOP基于TCP/IP協(xié)議。IIOP消息格式定義如下:moduleIIOP{//IDLextendedforversion1.1structVersion{octetmajor;octetminor;};structProfileBody_1_0{//renamedfromProfileBodyVersioniiop_version;stringhost;unsignedshortport;sequence<octet>object_key;};structProfileBody_1_1{Versioniiop_version;stringhost;unsignedshortport;sequence<octet>object_key;sequence<IOP::TaggedComponent>components;};};1.2.5DynamicInvocationInterface(DII)和DynamicSkeletonInterface(DSI)動(dòng)態(tài)調(diào)用接口(DII)和動(dòng)態(tài)骨架接口〔DSI〕是用來(lái)支持客戶在不知道效勞器對(duì)象的接口的情況下也能調(diào)用效勞器對(duì)象。一個(gè)增加了DII和DSI的CORBA調(diào)用模型如下:圖1.4增加了DII和DSI的調(diào)用模型我們?cè)凇疤岣咂曋性僭敿?xì)講述DII和DSI。1.2.6ObjectAdapter(對(duì)象適配器)對(duì)象適配器是ORB的一局部。它主要完成對(duì)象引用的生成、維護(hù),對(duì)象定位等功能。對(duì)象適配器有各種各樣。BasicObjectAdapter(BOA,根本對(duì)象適配器)實(shí)現(xiàn)了對(duì)象適配器的一些核心功能。而PortableObjectAdapter〔POA,可移植對(duì)象適配器〕那么力圖解決對(duì)象實(shí)現(xiàn)在不同廠商的ORBs下也能使用的問(wèn)題。最新的ORB產(chǎn)品一般都支持POA。還有其他一些專有領(lǐng)域的對(duì)象適配器如DatabaseObjectAdapter等。CORBA歷史CORBA是由OMG〔ObjectManagementGroup〕負(fù)責(zé)制定和維護(hù)的一組標(biāo)準(zhǔn)。OMG成立于1989年,是一個(gè)非營(yíng)利的國(guó)際性軟件組織,主要致力于為分布式計(jì)算提供解決方案并制定標(biāo)準(zhǔn)。除CORBA外,OMG還制定了如UML(UnitedModelingLanguage,統(tǒng)一建模語(yǔ)言)、CWM等其他重要標(biāo)準(zhǔn)。OMG目前已有世界上760多個(gè)成員,東南大學(xué)是中國(guó)唯一的OMG成員。CORBA自1990提出并被OMG采納以來(lái),已歷經(jīng)多個(gè)版本。分別稱為CORBA1、CORBA2和CORBA3。其中CORBA1是對(duì)CORBA1.x的統(tǒng)稱,CORBA2是對(duì)CORBA2.x的統(tǒng)稱。目前CORBA3標(biāo)準(zhǔn)還在制訂中,不久便可面世。下面是CORBA版本的更新歷史。CORBA1:CORBA1.090-12,提出CORBA框架CORBA1.191早期,定義了IDL及ORBInterface。CORBA1.292-93,修訂CORBA定義了ORB的一些根本特性,但是沒(méi)有定義而ORB間的通用協(xié)議。CORBA2主要解決這一問(wèn)題。CORBA2:CORBA2.094-12,定義了GIOP和IIOPCORBA2.197-08CORBA2.298-02,增加了POA。CORBA2.398-12CORBA2.3.199-10,一些Changebars.CORBA2.400-10,具備CORBA3的雛形,包括:QoSSpecification,AsynchronousMessaging,MinimumCORBA,Real-TimeCORBA,CORBAComponents,NotificationServices,FirewallSpecification等。CORBA2.4.100-11CORBA2.4.201-02因此,可以說(shuō),CORBA1提出ORB和IDL等CORBA根本概念,CORBA2主要奉獻(xiàn)是IIOP,而在制訂中CORBA3那么集中于CORBAComponents技術(shù)及Real-time特性等。對(duì)CORBA的簡(jiǎn)要介紹就到這里。關(guān)于OMG及CORBA的更多信息,可訪問(wèn)OMG站點(diǎn):.下面我們開(kāi)始編寫(xiě)第一個(gè)CORBA程序。2使用Orbix2000編寫(xiě)第一個(gè)CORBA程序在編寫(xiě)CORBA程序前,需要安裝CORBA環(huán)境。提供CORBA產(chǎn)品的廠商有很多,這里我們采用IONA公司的Orbix2000。IONA公司在CORBA領(lǐng)域一直處于領(lǐng)先地位,其產(chǎn)品幾乎總是和CORBA標(biāo)準(zhǔn)同時(shí)出臺(tái)。Orbix2000是IONA公司2001年2月發(fā)布的最新產(chǎn)品,它具有Real-time特性,而這正是CORBA在電信領(lǐng)域應(yīng)用的最關(guān)鍵的特性之一。而程序設(shè)計(jì)語(yǔ)言采用JAVA。其開(kāi)發(fā)環(huán)境為JBuilder4.JBuilder4是Enterprise公司〔原著名的Boland公司〕推出的最新JAVA集成開(kāi)發(fā)環(huán)境,其內(nèi)嵌JDK1.3。2.1安裝環(huán)境你需要安裝JAVA和CORBAORB環(huán)境,前者使用JBuilder4,后者使用Orbix2000。操作系統(tǒng)建議使用Windows2000〔ProfessionalorServer〕,因?yàn)槲覀兒竺嫠v的一些配置工作是基于Windows2000,和Windows98稍有區(qū)別。另外,Windows2000也更為穩(wěn)定。2.1.1安裝JavaOrbix2000需要一個(gè)JDK環(huán)境。如果你安裝了JBuilder4,可以直接使用其所帶的JDK1.3。否那么,你需要單獨(dú)安裝一個(gè)JDK。JDK是免費(fèi)的,你可以下載一個(gè)較新的版本。JBuilder4不是必需的。但我們建議你使用它,因?yàn)镴Builder4支持CORBA程序的編寫(xiě),除了能使用其自身的Visibroker〔Enterprise公司自己的ORB〕外,通過(guò)配置,還可直接使用Orbix。這對(duì)提高我們的開(kāi)發(fā)效率是很有幫助的。2.1.2安裝Orbix2000Orbix2000安裝很簡(jiǎn)單,按照安裝步驟進(jìn)行即可。但要注意以下幾點(diǎn):盡量按缺省方式,這樣可以省去不少配置上的麻煩。如安裝路徑使用C:\ProgramFiles\IONA;使用典型安裝等。Orbix2000同時(shí)支持JAVA和C,還帶有一個(gè)COMetDevelopmentKit。只需安裝Orbix2000v1.2JavaDevelopmentKit即可。圖2.1安裝Orbix2000forJava安裝過(guò)程中,會(huì)提示輸入JDK的路徑,所以,最好先安裝JAVA。假設(shè)JBuilder4安裝在C:\JBuilder4目錄下,那么,在提示框中輸入C:\JBuilder4\jdk1.3。Orbix2000需要license。License.txt文件中包含有所需的license.txt,告訴安裝程序這個(gè)文件所在的位置,安裝程序會(huì)自動(dòng)讀取并安裝所需的license。圖2.2安裝license最后,安裝程序會(huì)做一些配置工作,為使配置生效,你需要重啟機(jī)器。2.1.3配置Orbix2000為使Orbix2000能正常工作,還需要做一些額外的配置工作,主要是設(shè)置一些必需的環(huán)境變量。這里以Windows2000為例?!瞁indows98中需要在autoexec.bat中用相應(yīng)命令設(shè)置?!撤_(kāi)Windows的控制面板,找到“System〞-“Advanced〞-“EnvironmentVariables〞,如圖2.3所示。圖2.3配置環(huán)境變量“EnvironmentVariables〞分為兩局部:“Uservariables〞和“Systemvariables〞?!惨韵聵?biāo)*的環(huán)境參數(shù)是需要用戶自己配置的。其他參數(shù)安裝程序會(huì)自動(dòng)配置,但由于安裝不得當(dāng)或其他原因,也可能不正確,這里列出來(lái),對(duì)照檢查一遍是否都正確。另外,我們假設(shè)程序安裝在C:\ProgramFiles\IONA目錄下,如果不是,作相應(yīng)改變?!?.Uservariables:1〕CLASSPATH〔*〕在CLASSPATH的末尾添加以下路徑:C:\ProgramFiles\IONA\orbix_art\1.2\localhost;.\;.\classes〔添加的局部與前面局部用分號(hào);隔開(kāi),下同〕it_javac,it_java工具會(huì)在運(yùn)行時(shí)添加C:\ProgramFiles\IONA\orbix_art\1.2\classes,所以不必在這里設(shè)置。增加當(dāng)前目錄.\和.\classes會(huì)對(duì)你工作帶來(lái)便利。2〕PATH在末尾增加C:\ProgramFiles\IONA\bin這樣你可以在任何目錄運(yùn)行Orbix2000的命令了。2.Systemvariables:1〕IT_PRODUCT_DIR(*)如果沒(méi)有IT_PRODUCT_DIR,單擊〞new〞按鈕,添加它,其值設(shè)置為C:\ProgramFiles\IONA,也即程序安裝路徑。這個(gè)參數(shù)非常重要,Orbix自動(dòng)設(shè)置其他關(guān)于目錄的參數(shù)時(shí)都基于它。2〕JAVA_HOME(*)添加JAVA_HOME,設(shè)置為C:\JBuilder4\jdk1.3,或其他JDK路徑。it_javac和it_java的運(yùn)行需要它。3〕PATH增加C:\ProgramFiles\IONA\binUservariables和Systemvariables中只需設(shè)置一個(gè)就行,當(dāng)然都設(shè)置也無(wú)妨。4〕IT_IDL_CONFIG_FILE〔*〕idlcompiler工具需要這個(gè)參數(shù),添加這個(gè)參數(shù),設(shè)置為C:\ProgramFiles\IONA\orbix_art\1.2\etc在開(kāi)始編程之前,請(qǐng)確保上述設(shè)置是正確的。當(dāng)你使用命令行方式時(shí),如果你改變了設(shè)置,為使改變生效,需要重新開(kāi)一個(gè)DOS窗口,然后在此窗口下操作,但不必重啟機(jī)器。2.2編寫(xiě)第一個(gè)CORBA程序2.2.1命令行方式我們先介紹在命令行方式下的開(kāi)發(fā)步驟,編寫(xiě)一些小型的測(cè)試程序可以使用這種方式,因?yàn)闆](méi)有必要啟動(dòng)龐大的JBuilder4。后面我們?cè)俳榻B在JBuilder4集成開(kāi)發(fā)環(huán)境下的使用方法。實(shí)際上兩者步驟是類似的,只是方便程度不一樣。通常,開(kāi)發(fā)一個(gè)CORBA應(yīng)用的大致步驟如下:1〕定義IDL。2〕用IDLcomplier將IDL編譯成ClientStub代碼和ServerSkeleton代碼。3〕編寫(xiě)Server方的實(shí)現(xiàn)(Implementation)代碼。4〕編寫(xiě)Server。5〕編寫(xiě)Client。6〕編譯和調(diào)試。7〕運(yùn)行程序。編寫(xiě)ServerImplementation和編寫(xiě)Server不是一回事。Server和Client都是帶有main()函數(shù)的可執(zhí)行的程序。但ServerImplementation是對(duì)interface的實(shí)現(xiàn),它可以單獨(dú)放在一個(gè).java文件中,也可以和Server放在同一個(gè)文件中。下面以一個(gè)簡(jiǎn)單的例子詳細(xì)講解各個(gè)步驟。第一步:定義IDL首先建立一個(gè)工作目錄,這里假設(shè)為D:\mywork\simpleDemo。然后編寫(xiě)IDL。這個(gè)例子我們使用1.2.1節(jié)中g(shù)rid.idl,一個(gè)對(duì)二維數(shù)組操作的例子。可以使用任何文本編輯器編寫(xiě),如UltraEdit等。之后保存到D:\mywork\simpleDemo下。grid.idl定義了一個(gè)接口interfacegrid。其中定義兩個(gè)方法get()和set(),用以獲取和設(shè)置數(shù)組元素值。注意屬性〔attribute〕的定義,這是C和JAVA中沒(méi)有的概念〔在Delphi中有這個(gè)概念〕,實(shí)際上它就相當(dāng)于類的數(shù)據(jù)定義,但在映射到Java時(shí)被映射成方法。第二步:編譯IDL為JavaStub和Skeleton.翻開(kāi)DOS窗口,進(jìn)入到D:\mywork\simpleDemo目錄,在Dos命令提示符下鍵入:idl–jbase–jpoagrid.idl參數(shù)-jbase表示生成javastubcode,參數(shù)–jpoa表示生成javaskeletoncode,在Orbix2000中,骨架代碼使用POA方式。缺省情況下idl編譯器會(huì)創(chuàng)立一個(gè)java_output的目錄,如果idl中有module定義,還會(huì)生成與此module同名的子目錄,并將編譯后生成的.java程序放在此目錄中。你可以開(kāi)關(guān)參數(shù)控制編譯方式,例如,如果想將客戶stub和效勞器skeleton代碼分開(kāi),可以鍵入:idl–jbase:-Oclientgrid.idlidl–jpoa:-Oservergrid.idl-O參數(shù)控制輸出目錄。編譯器會(huì)自動(dòng)生成client和server目錄,并將代碼分別放在這目錄中。我們知道,idl編譯器會(huì)將module映射成package,缺省情況下,modulesimpleDemo映射成packagesimpleDemo。如果想自己控制package的生成,例如要生成packagedemos.simpleDemo形式的包,可以:idl–jbase:-Oclient–jbase:-Pdemosgrid.idl編譯器會(huì)在module指定的包前再加上-P參數(shù)指定的包前綴,即生成packagedemos.simpleDemo。注意不要寫(xiě)成-Pdemos.simpleDemo,否那么會(huì)生成packagedemos.simpleDemo.simpleDemo。附錄B中列出了idl命令的用法。注意,我們看看idl生成的stub和skeleton代碼。StubCode包含以下文件:grid.java定義了接口interfacegrid,publicinterfacegridextendsgridOperations,org.omg.CORBA.Object,{}直接由grid.idl中的interfacegrid映射而來(lái)。_gridStub.java樁代碼,定義了class_gridStubpublicclass_gridStubimplementsgrid{publicvoidset(){…};pubicintget(){..};…}class_gridStub中實(shí)現(xiàn)了客戶方的set()和get()等方法,它們封裝了ORB的功能,截取客戶的調(diào)用,執(zhí)行Marshaling/Unmarshing等操作,最終得到調(diào)用結(jié)果。也就是說(shuō),在客戶方聲明一個(gè)grid類型的對(duì)象,實(shí)際上使用gridHelper操作得到的是一個(gè)_gridStub類型的實(shí)例,調(diào)用grid上的方法實(shí)際上是調(diào)用_gridStub上的方法。gridHelper.java定義publicclassgridHelper{}幫助客戶方grid對(duì)象生成一個(gè)_gridStub類型的實(shí)例,同時(shí)得到效勞器對(duì)象的引用。gridHolder.java定義publicfinalclassgridHolder{}當(dāng)需要處理out,inout類型的參數(shù)時(shí),需要這個(gè)類。gridOperations.java定義publicinterfacegridOperations{voidset()intget()}這個(gè)接口實(shí)際上是Server使用的。當(dāng)客戶方需要使用callback功能時(shí),也需要這個(gè)接口。SkeletonCode那么包含以下文件:gridPOA.java 定義類abstractpublicclassgridPOAimplementsorg.omg.CORBA.portable.InvokeHandler,gridOperations{}Server方的Implementation代碼直接繼承自這個(gè)類。gridPOATie.java定義類publicclassgridPOATieextendssimpleDemo.gridPOA{}當(dāng)使用代理方式而不是繼承方式創(chuàng)立ServerObject時(shí),使用這個(gè)類。-jpoa參數(shù)只生成上述兩個(gè)文件,實(shí)際上SkeletonCode也包含gridOperations.java,因?yàn)閏lassgridPOA就是實(shí)現(xiàn)gridOperations的。上述接口〔類〕的繼承關(guān)系如下:grid.idl中只定義了一個(gè)interfacegrid,實(shí)際上如果定義了多個(gè)interface,那么對(duì)每個(gè)interface都會(huì)生成和上面類似的一套代碼。第三步:編寫(xiě)Server方的Implementation代碼〔即編寫(xiě)Servant〕到現(xiàn)在為止,我們才開(kāi)始真正編寫(xiě)代碼。引入了POA概念后,Server方的實(shí)現(xiàn)對(duì)象稱為Servant,編寫(xiě)Implementation代碼實(shí)際上就是對(duì)IDL定義的每個(gè)interface,都編寫(xiě)一個(gè)Servant,其中要現(xiàn)實(shí)interface中定義的每個(gè)方法。.這里我們將Servant類定義為classgridImpl,類名字可以自己隨便取,通常都命名為xxxImpl的形式。ClassgridImpl直接繼承自gridPOA。在D:\mywork\simpleDemo目錄下創(chuàng)立一個(gè)gridImpl.java文件,內(nèi)容如下:packagesimpleDemo;publicclassgridImplextendsgridPOA{shortm_height;//storetheheightshortm_width;//storethewidthintm_array[][];//a2Darraytoholdthegriddataprivateinti=0;privateintj=0;privateintn=0;publicgridImpl(shortwidth,shortheight){m_array=newint[width][height];//allocatethe2Darraym_height=height;//setupheightm_width=width;//setupwidth}/**Implementationofthemethodwhichreadstheheightattribute*/publicshortheight(){returnm_height;}/**Implementationofthemethodwhichreadsthewidthattribute*/publicshortwidth(){returnm_width;}/**Implementationofthesetoperation*/publicvoidset(shortx,shorty,intvalue){i++;n++;System.out.println("-----μú"+n+"′?μ÷ó?Server/μú"+i+"′?μ÷ó?grid.set()----");System.out.println("Ingrid.set()x="+x);System.out.println("Ingrid.set()y="+y);System.out.println("Ingrid.set()value="+value);m_array[y][x]=value;}/**Implementationofthegetoperation*/publicintget(shortx,shorty){j++;n++;System.out.println("-----μú"+n+"′?μ÷ó?Server/μú"+j+"′?μ÷ó?:grid.get()----");intvalue=m_array[y][x];System.out.println("Ingrid.get()x="+x);System.out.println("Ingrid.get()y="+y);System.out.println("Ingrid.get()value="+value);returnvalue;}}編寫(xiě)好Implementation代碼后,實(shí)際上你就可以編譯了。使用it_javac命令進(jìn)行編譯。在編譯gridImpl.java之前,請(qǐng)先編譯idl生成的stub和skeleton代碼。轉(zhuǎn)到D:\mywork\simpleDemo,用mkdirclasses建立一個(gè)目錄d:\mywork\simpleDeom\classes,我們編譯后的class文件都放在這個(gè)目錄下。編譯樁和骨架代碼。轉(zhuǎn)到D:\mywork\simpleDemo\java_output\simpleDemo目錄,鍵入命令:it_javac–dd:\mywork\simpleDemo\classes*.java(-d參數(shù)指明編譯后的class文件的輸出目錄,因?yàn)?java中指定了包名simpleDemo,會(huì)自動(dòng)創(chuàng)立一個(gè)simpleDemo子目錄,.class文件放在此子目錄中。)編譯gridImpl.java。轉(zhuǎn)到D:\mywork\simpleDemo,鍵入命令:it_javac–classpath.\classes–dclassesgridImpl.java?!?classpath指明gridImpl.java要用到的其他類文件,因?yàn)間ridImpl.java中用到了骨架文件中的類,也即第2〕步所編譯的文件,所以需要用-classpath指明?!虫I入it_javac可以查看此命令的幫助。it_javac實(shí)際上還是調(diào)用jdk的javac進(jìn)行編譯的,需要用參數(shù)JAVA_HOME指定,這是為什么我們要對(duì)JAVA_HOME進(jìn)行配置的原因。因此改變JAVA_HOME就可改變使用的javac編譯器,非常方便。使用it_javac而不直接使用javac的另一好處是it_javac會(huì)自動(dòng)在原有CLASSPATH環(huán)境變量后加上CORBA所需的類庫(kù)又不改變?cè)蠧LASSPATH的值〔所以我們不需在環(huán)境變量中對(duì)CLASSPATH做orbix2000的類庫(kù)設(shè)置,而只需做其他設(shè)置〕,同時(shí)用戶還可以用-classpath指定額外的class路徑而不會(huì)覆蓋已有的CLASSPATH值。it_javac會(huì)將這些值全部傳遞給JAVA_HOME指定的javac編譯器。第四步:編寫(xiě)ServerServant僅是實(shí)現(xiàn)代碼,而Server是包含main()函數(shù)的可執(zhí)行的代碼。Server的主要任務(wù)就是創(chuàng)立所需的Servant,同時(shí)通知POA已準(zhǔn)備就緒,可以接受客戶方的請(qǐng)求。新建一個(gè)文件gridServer.java,放在D:\mywork\simpleDemo下,代碼如下:packagesimpleDemo;importjava.io.*;importorg.omg.CORBA.*;importorg.omg.PortableServer.*;publicclassgridServer{publicstaticORBglobal_orb;publicstaticvoidmain(String[]args){finalshortwidth=100;finalshortheight=100;//1.InitaliseORBforanapplicationandresolveRootPOAreferencetry{System.out.println("InitializingtheORB");global_orb=ORB.init(args,null);org.omg.CORBA.Objectpoa_obj=global_orb.resolve_initial_references("RootPOA");org.omg.PortableServer.POAroot_poa=org.omg.PortableServer.POAHelper.narrow(poa_obj);//2.Createservants,activatethem,writetheirIORstofiles.//System.out.println("Creatingobjects");gridImplgrid=newgridImpl(width,height);byte[]grid_oid=root_poa.activate_object(grid);export_object(root_poa,grid_oid,"../grid.ior",gridHelper.id());//3.ActivatethePOAManagertoallownewrequeststoarrive//System.out.println("ActivatingthePOAManager");org.omg.PortableServer.POAManagerpoa_manager=root_poa.the_POAManager();poa_manager.activate();//4.GivecontroltotheORBtoletitprocessincomingrequests//System.out.println("GivingcontroltotheORBtoprocessrequests");global_orb.run();System.out.println("Done");}catch(org.omg.CORBA.ORBPackage.InvalidNameex){System.out.println("Failedtoobtainrootpoa"+ex);}catch(org.omg.PortableServer.POAPackage.WrongPolicyex){System.out.println("InvalidPOApolicy"+ex);}catch(org.omg.PortableServer.POAPackage.ServantAlreadyActiveex){System.out.println("POAservantalreadyactive"+ex);}catch(org.omg.PortableServer.POAManagerPackage.AdapterInactiveex){System.out.println("POAManageractivatefailed"+ex);}System.out.println("gridServerexiting...");}/***Thisfunctiontakesapoaandobjectid,buildsanobject*referencerepresentingthatobject,andexportstheobject*referencetoafile.*/publicstaticvoidexport_object(POApoa,byte[]oid,Stringfilename,Stringtype_id){try{org.omg.CORBA.Objectref=poa.create_reference_with_id(oid,type_id);Stringstringified_ref=global_orb.object_to_string(ref);RandomAccessFileFileStream=null;try{FileStream=newRandomAccessFile(filename,"rw");FileStream.writeBytes(stringified_ref);FileStream.close();}catch(Exceptionex){System.out.println("Failedtowriteto"+filename);}}catch(org.omg.PortableServer.POAPackage.WrongPolicyex){System.out.println("InvalidPOApolicy"+ex);}}}通常,一個(gè)Server主程序執(zhí)行以下幾個(gè)步驟:初始化ORB;創(chuàng)立Servant對(duì)象;激活POA管理器;通知ORB準(zhǔn)備接受請(qǐng)求。只有第二步是需要用戶編寫(xiě)的,其他步驟所有Server程序都大致一樣。在創(chuàng)立Servant對(duì)象后還需注冊(cè)其引用,這里我們使用了將其引用保存到文件中的方法〔filebased〕。方法export_object〔〕用來(lái)完成這一個(gè)工作,這是我們自己定義的,實(shí)際上可以作為一個(gè)通用方法使用在所有Server程序中使用。當(dāng)客戶方Orbix2000提供了兩種獲取對(duì)象引用的方式,一種叫filebased,即讀取文件的方式;一種叫NamingService,即通常所說(shuō)的命名效勞。前一種方式的好處是不需要啟動(dòng)ORB守護(hù)進(jìn)程,只需啟動(dòng)Server和Client兩個(gè)程序就可以了。當(dāng)Client需要使用獲得Servant的引用時(shí),需要從文件中讀取,所以實(shí)際上當(dāng)Client和Server在同一臺(tái)機(jī)器上時(shí)才是可行的,在真正跨機(jī)器、跨平臺(tái)的分布式應(yīng)用中,通常使用NamingServic,它的缺乏是需要啟動(dòng)NamingService守護(hù)進(jìn)程,這對(duì)其健壯性要求很高,可能成為系統(tǒng)瓶頸。第五步:編寫(xiě)ClientClient程序就是客戶方的可執(zhí)行程序,它需要使用到Server方的效勞。新建一個(gè)文件gridClient.java,保存到D:\mywork\simpleDemo,源代碼如下:packagesimpleDemo;importjava.io.*;importorg.omg.CORBA.*;/**ThejavaclientwillconnecttotheGridserverandinvoke*operationsenablingittomanipulatea2dimensionalarray.*/publicclassgridClient{publicstaticvoidmain(Stringargs[]){System.out.println("TheClientbegin...\n");ORBorb=null;gridgridProxy=null;gridgridProxy2=null;org.omg.CORBA.Objectobj_ref=null;/**InitalisetheORBforanOrbixapplication.*/try{orb=ORB.init(args,null);/**EstablishaCORBAconnectionwiththegridserverand*returnaproxyforit.*/obj_ref=import_object(orb,"../grid.ior"); gridProxy=gridHelper.narrow(obj_ref);gridProxy2=gridHelper.narrow(obj_ref);/**Getthewidthandheightbycallingtheremote*widthandheightoperationsonthegridserver.*/shortwidth=0;shortheight=0;/**Setsomevaluesintheremotegrid.*/shortx_coord=2;shorty_coord=4;try{gridProxy.set(x_coord,y_coord,123);gridProxy2.set(x_coord,y_coord,111);}catch(SystemExceptionex){System.out.println("FAIL\tExceptionsettingvaluesinthegrid.");System.out.println(ex.toString());System.exit(1);}/**Checkthevaluesplacedinthegrid*weresetcorrectly.*/intval=0,val2=0;x_coord=2;y_coord=4;val=gridProxy.get(x_coord,y_coord);val2=gridProxy2.get(x_coord,y_coord);System.out.println("Valueforgrid[2,4]is"+val);System.out.println("Value2forgrid[2,4]is"+val2);}catch(org.omg.CORBA.SystemExceptionex){System.err.println(ex);System.exit(ex.minor);}catch(Exceptionex){System.err.println(ex);System.exit(1);}finally{if(orb!=null){try{orb.shutdown(true);}catch(Exceptionex){/*donothing*/}}}System.out.println("\nGriddemofinished.");}publicstaticorg.omg.CORBA.Objectimport_object(ORBorb,Stringfilename){Stringior=null;RandomAccessFileFileStream=null;System.out.println("Readingobjectreferencefrom"+filename);try{FileStream=newRandomAccessFile(filename,"r");ior=FileStream.readLine();returnorb.string_to_object(ior);}catch(Exceptione){System.out.println("Erroropeningfile"+filename);returnnull;}}}通常,客戶程序需要執(zhí)行以下步驟:初始化ORB;獲得Servant對(duì)象的引用;調(diào)用其上的操作這里使用了讀取文件的方法獲得對(duì)象引用,自定義的方法import_object()用來(lái)完成這里任務(wù)。這個(gè)程序生成了兩個(gè)客戶對(duì)象:gridProxy和gridProxy2,只是為了說(shuō)明當(dāng)使用同一個(gè)引用的時(shí)候,盡管是多個(gè)客戶對(duì)象,但操作的是同一個(gè)Servant對(duì)象的數(shù)據(jù)。第六步:編譯和運(yùn)行程序最后一步便是編譯和執(zhí)行程序了。轉(zhuǎn)到D:\mywork\simpleDemo目錄下,鍵入命令:it_javac–classpathclasses–dclassesgridServer.javait_javac–classpathclasses–dclassesgridClient.java編譯效勞器和客戶程序。編譯后的.class文件放在.\classes\simpleDemo目錄下。然后便可執(zhí)行它們了。轉(zhuǎn)到classes目錄下,鍵入:it_javasimpleDemo.gridServer啟動(dòng)效勞器。重新開(kāi)一個(gè)DOS窗口,轉(zhuǎn)到D:\mywork\simpleDemo\classes,鍵入it_javasimpleDemo.girdClient運(yùn)行客戶程序。圖2.4程序運(yùn)行結(jié)果可以看到,盡管gridProxy將值設(shè)為123,但結(jié)果仍是111,這是因?yàn)橐驯籫ridProxy2修改的緣故。這個(gè)小問(wèn)題告訴我們,在設(shè)計(jì)Servant對(duì)象的實(shí)現(xiàn)時(shí),需要考慮可能多個(gè)客戶修改同一個(gè)數(shù)據(jù)所帶來(lái)的影響。至此,一個(gè)簡(jiǎn)單的但五臟俱全的CORBA應(yīng)用程序遍全部完成了。2.2.2使用集成開(kāi)發(fā)環(huán)境JBuilder4使用集成開(kāi)發(fā)環(huán)境JBuilder4可以帶來(lái)不少便利,例如可以使用工程化〔Project〕管理,可以利用向?qū)Чδ艿取?.2.2.1為JBuilder4配置CORBA環(huán)境在進(jìn)行CORBA編程前需要對(duì)JBuilder4進(jìn)行一些配置。配置Orbix2000CORBALibrary需要將Orbix2000提供的CORBA類庫(kù)增加到JBuilder4環(huán)境中來(lái)。選擇“tools〞-“ConfigureLibraries〞菜單,彈出如下窗口:圖2.5ConfigureLibraries單擊“New〞按鈕添加Library。彈出如下窗口:圖2.6增加Orbix2000CORBA類庫(kù)按圖2.6所示將〞Name〞設(shè)置為“orbix2000〞,“Location〞選擇“UserHome〞,單擊“Add〞按鈕,選擇目錄“C:\ProgramFiles\IONA\orbix_art\1.2\classes〞,所需的orbix2000CORBA類庫(kù)便添加進(jìn)來(lái)了,添加后如圖2.7所示。圖2.7配置后的orbix2000library為Project指定缺省的CORBA環(huán)境剛剛僅僅是增加了類庫(kù)。因?yàn)镴Builder4能支持多種ORB,所以我們需要指定一種ORB。選擇“Tools〞-“Enterprisesetup〞菜單,彈出如圖2.8所示窗口。圖2.8EnterprisesetupforCORBA缺省情況下,JBuilder4支持Visibroker和OrbixWeb兩種ORB。Orbix2000是OrbixWeb的升級(jí)產(chǎn)品,JBuilder4目前不提供缺省支持,但我們可以自己添加。單擊“New〞按鈕,添加Orbix2000CORBA環(huán)境,如圖2.9所示。圖2.9配置Orbix2000CORBA環(huán)境其中“Nameforthisconfiguration〞設(shè)為“orbix2000〞,“PathforORBtools〞設(shè)為C:/ProgameFiles/IONA/bin〞,“Libraryforprojects〞設(shè)為“orbix2000〞〔選擇前面第一步中設(shè)置的orbix2000Library〕,“IDLcompilercommand〞設(shè)為“idl–jbase–jpoa〞,“Commandoptionforoutputdirectory〞設(shè)為“〞〔一個(gè)空格,如果不設(shè)置,JBuilder會(huì)報(bào)告出錯(cuò)〕。2.2.2.2使用JBuilder4開(kāi)發(fā)CORBA程序好了,現(xiàn)在可以編程了。如果你還不熟悉使用JBuilder4,按照以下步驟進(jìn)行:新建一個(gè)工程(Project)和大多數(shù)集成開(kāi)發(fā)環(huán)境一樣,JBuilder4采用工程進(jìn)行管理,建立工程是開(kāi)發(fā)程序的第一步。選擇“File〞-“NewProject〞菜單,翻開(kāi)“Projectwizard〞,如圖2.10所示。圖2.10工程向?qū)А睵rojectwizard〕為了和2.2.1節(jié)中的例子相區(qū)別,我們給“Projectname〞取名為“simpleDemo2〞,“Rootpath〞設(shè)為“D:\mywork〞,其他采用缺省設(shè)置。JBuilder4會(huì)在“Rootpath〞下建立一個(gè)與“Projectname〞同名的目錄(這里為D:\mywork\simpleDemo2),并建立子目錄src,bak,classes,分別放置源文件、備份文件和Class文件。單擊“Next〞按鈕,其中會(huì)有“Requiredlibraries〞,確保有“orbix2000〞。你可以按提示操作,之后單擊“Finish〞完成工程simpleDemo2的創(chuàng)立。創(chuàng)立IDL實(shí)際上你可把已有的IDL文件加到工程中,這里為了說(shuō)明用JBuilder4開(kāi)發(fā)的全過(guò)程,我們新建一個(gè)IDL文件。選擇“File〞-“New〞按鈕,切換到“Enterprise〞頁(yè),可以看到如圖2.11所示窗口。圖2.11創(chuàng)立IDL向?qū)螕簟癝ampleIDL〞,彈出如圖2.12所示窗口。圖2.12SampleIDLWizard這里,“Package〞設(shè)為空,因?yàn)槲覀冏约涸?idl中定義module,IDL編譯器會(huì)自動(dòng)生成相應(yīng)的包名。如果你在這里設(shè)置Package,那么會(huì)將此Package作為moudle的前綴,即生成xx.xx形式的包名?!癋ilename〞設(shè)為“grid.idl〞。單擊“OK〞按鈕,然后編寫(xiě)IDL代碼。我們把2.2.1節(jié)中的D:\mywork\simpleDemo\grid.idl的代碼拷貝到這里。如圖2.13所示。圖2.13編寫(xiě)grid.idl但是很遺憾,Orbix2000的idl編譯器命令無(wú)法在JBuilder4中使用,這是因?yàn)镴Builder4需要在“Enterprisesetup〞中顯式的指定outputdirectory的開(kāi)關(guān)參數(shù)〔如-O〕,JBuilder會(huì)重新組裝idl命令,并自動(dòng)將缺省的outdirectory放在此開(kāi)關(guān)參數(shù)后,但中間會(huì)有一個(gè)空格。如下所示:C:/ProgramFiles/IONA/bin\idl-jbase-jpoa:O"D:\mywork\simpleDemo2\classes\Temporary_Files""D:\mywork\simpleDemo2\src\grid.idl"而在orbix2000的idl–jbase:-O指定outputdirectory時(shí),必須讓outputdirectory緊跟在-O參數(shù)后,中間不能有任何空格。因此,這條命令會(huì)出錯(cuò)。所以,我們只能在命令行方式下編譯idl了。在DOS窗口下轉(zhuǎn)到D:\mywork\simpleDemo2\src目錄下,輸入命令:idl–jbase–jpoagrid.idl編譯好的.java文件放在D:\mywork\simpleDemo2\src\output_java\simpleDemo下,在JBuilder4菜單中選擇“Project〞-“Addnewfiles/package…〞命令將它們加到工程中來(lái)。當(dāng)需要在工程中增加已編好的java程序時(shí),你可以采用這種方法。按“Ctrl+F9〞或選擇菜單中的“Project〞-“MakeprojectsimpleDemo2.jpx〞命令,可以編譯我們剛剛增加的由IDL生成的java程序〔即樁和骨架程序〕。在編譯中會(huì)發(fā)現(xiàn)grid.idl編譯不通過(guò),我們前面已經(jīng)講述了原因,因?yàn)橐呀?jīng)手工編譯過(guò)了,我們不去管它。另外,還會(huì)發(fā)現(xiàn)如下警告信息:Warning#:908:checksourcepath;source:\mywork\simpleDemo2\src\java_output\simpleDemo\gridPOATie.javacannotbefoundonsourcepathbyappending\simpleDemo\gridPOATie.javatoeachsourcepathentry可以在“Project〞-“Projectproperties〞中的“Paths〞的“Source〞中增加“D:\mywork\simpleDemo2\src\java_output〞一項(xiàng)即可。出現(xiàn)類似的問(wèn)題時(shí)可以用這種方式解決。當(dāng)然因?yàn)檫@是警告信息,你也可以忽略它。圖2.14為工程增加Sourcepath編寫(xiě)Servant、Server及客戶程序在JBuilder4中新建一個(gè).java文件可以使用菜單中的“File〞-“Newclass〞,如圖2.15所示。圖2.15ClassWizard我們用這種方式創(chuàng)立gridImpl.java,這里“Classname〞設(shè)為“gridImpl〞,在“Option〞中設(shè)為“Public〞。一個(gè)Java文件中只能有一個(gè)publicclass,它必須和.java文件名同名。由于gridImpl是實(shí)現(xiàn)代碼〔即Servant〕,所以上面沒(méi)有選擇“Generatemainmethod〞。如果要?jiǎng)?chuàng)立Server或Client程序,應(yīng)該選這一選項(xiàng)。這里我們采用和2.2.1中相同的代碼。4〕編譯執(zhí)行程序創(chuàng)立好Servant、Server和Client后,我們就可以編譯執(zhí)行了。在執(zhí)行程序前,需要做以下工作:將grid.idl從工程中刪去?!策@是因?yàn)閛rbix2000idl無(wú)法在JBuilder4下編譯成功,而每次執(zhí)行程序前JBuilder4都會(huì)去編譯它〕重新配置orbix2000Library。在其classes中增加以下兩個(gè)目錄:C:\ProgramFiles\IONA\etcC:\ProgramFiles\IONA\orbix_art\1.2\localhost前一個(gè)目錄存放orbix2000license(license.txt);后一個(gè)目錄存放localhost配置文件〔localhost.cfg〕。每一個(gè)Orbix2000程序都會(huì)檢查license和配置文件。增加后如圖2.16所示。圖2.16重新配置orbix2000Library配置虛擬機(jī)(VM)參數(shù)你可以用菜單中的“Project〞-“Projectproperties…〞-“Run〞進(jìn)行配置。如圖2.17所示。圖2.17配置VM環(huán)境“Mainclass〞選擇你要運(yùn)行的程序,這里為simpleDemo.gridServer?!癡Mparameters〞設(shè)置為以下值:注意只能是一行,不能有回車(chē)?!癆pplicationparameters〞設(shè)置為:-ORBdomain_namelocalhost這樣你就可以運(yùn)行g(shù)ridServer程序了。運(yùn)行g(shù)ridClient時(shí),保證設(shè)置和上述一樣。右鍵單擊gridClient.java,從彈出菜單中選擇“Run〞,便可運(yùn)行。為了設(shè)置能對(duì)所有工程生效,你可以在“Project〞-“Defaultprojectproperties…〞中對(duì)VM環(huán)境進(jìn)行設(shè)置,和上面設(shè)置的一樣。使用ORBacus開(kāi)發(fā)CORBA程序ORBacus是OOC(ObjectOrientedCompany)公司的ORB產(chǎn)品。ORBacus小巧但功能齊全,尤其是性能很高,提供實(shí)時(shí)CORBA特性,非常適合于電信領(lǐng)域。另外,ORBacus提供源代碼,這對(duì)我們進(jìn)一步揭開(kāi)CORBAORB內(nèi)幕、提高程序性能、解決棘手問(wèn)題都有好處。同時(shí)它還是免費(fèi)的,當(dāng)然商業(yè)用途例外。3.1安裝環(huán)境這里我們使用ORBacus4.0.5。ORBacus不需要安裝過(guò)程,只需將它拷貝到某個(gè)目錄下就行。這里假設(shè)在C:\ORBacus目錄下。ORBacus有一個(gè)bin\目錄,存放了一些可執(zhí)行文件,如jidl.exe〔ORBacus的IDL編譯器〕等。另外還有一個(gè)lib\目錄,這里存放了ORBacus的庫(kù)文件,以壓縮包的形式存在。ORBacus也不用做任何配置。但為了使用方便,我們可以做以下簡(jiǎn)單配置:參照2.1.3節(jié)介紹的方法,1〕為CLASSPATH增加:C:\Orbacus\lib\ob.jar;.\;.\classesob.jar是最根本的ORB類庫(kù)。如果你的程序使用了其他功能,需要增加相應(yīng)的類庫(kù)。例如使用了命名效勞,需要增加OBNaming.jar等。為PATH增加:C:\Orbacus\bin實(shí)際上ORBacus\bin\下只提供了jidl.exe等程序。ORBacus沒(méi)有自己的javac、java程序,而是直接使用JDK的相應(yīng)程序。事實(shí)上這對(duì)我們更加方便。保證PATH變量設(shè)置了JDK路徑。如果你的ORBacus的目錄不是這樣,作相應(yīng)改變。3.2在ORBacus下編寫(xiě)CORBA程序下面我們以O(shè)RBacus附帶的一個(gè)例子講解使用ORBacus編寫(xiě)CORBA程序的過(guò)程。這個(gè)例子在src\ob\demo\hello目錄下。為了不致改變它,我們把它(連同hello目錄)拷貝到D:\mywork目錄下。我們要用到以下幾個(gè)文件:D:\mywork\hello\Hello.idlidl定義文件D:\mywork\hello\Hello_Impl.javaServant實(shí)現(xiàn)D:\mywork\hello\Client.java客戶程序D:\mywork\hello\Server.java效勞器程序3.2.1命令行方式我們先介紹命令行方式下的編程步驟。實(shí)際上不管使用何種ORB平臺(tái),編程步驟都是是類似的。2.2.1節(jié)已經(jīng)做了詳細(xì)說(shuō)明,這里只是簡(jiǎn)單介紹。1〕IDL定義Hello.idl定義如下:interfaceHello{voidsay_hello();};注意Hello.idl沒(méi)有定義Module。它只定義了一個(gè)接口InterfaceHello,并且只有一個(gè)方法voidsay_hello()。2〕編譯IDL為JavaStub和SkeletonORBacus的IDLComplier命令為jidl。翻開(kāi)DOS窗口,轉(zhuǎn)到D:\mywork\hello目錄下,鍵入:jidl--packagehelloHello.idl其
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 天津市紅橋區(qū)2025-2026學(xué)年高三上學(xué)期期末語(yǔ)文試卷(含答案)
- 化工企業(yè)維修工培訓(xùn)課件
- 化工企業(yè)不安全行為培訓(xùn)課件
- 化工儀表工培訓(xùn)課件
- 鋼結(jié)構(gòu)焊后熱處理技術(shù)要點(diǎn)
- 2026年菏澤單縣事業(yè)單位公開(kāi)招聘初級(jí)綜合類崗位人員(26人)備考考試試題及答案解析
- 2026湖南株洲市國(guó)資委選聘市屬監(jiān)管企業(yè)專職外部董事考試參考題庫(kù)及答案解析
- 2026年度煙臺(tái)市福山區(qū)事業(yè)單位公開(kāi)招聘工作人員(68人)考試備考試題及答案解析
- 2026北京航空航天大學(xué)計(jì)算機(jī)學(xué)院聘用編高級(jí)研發(fā)工程師F崗招聘1人備考考試題庫(kù)及答案解析
- 養(yǎng)生有關(guān)活動(dòng)策劃方案(3篇)
- 國(guó)有企業(yè)落實(shí)擴(kuò)大內(nèi)需戰(zhàn)略的路徑研究
- 技術(shù)規(guī)范評(píng)審匯報(bào)
- GB/T 462-2023紙、紙板和紙漿分析試樣水分的測(cè)定
- 不組織不參與非法集資承諾書(shū)
- 2023春國(guó)開(kāi)農(nóng)業(yè)經(jīng)濟(jì)基礎(chǔ)單元自測(cè)1-16試題及答案
- 2023年高鐵信號(hào)車(chē)間副主任述職報(bào)告
- GB/T 879.4-2000彈性圓柱銷(xiāo)卷制標(biāo)準(zhǔn)型
- GB/T 1957-2006光滑極限量規(guī)技術(shù)條件
- GB 28480-2012飾品有害元素限量的規(guī)定
- 劉一秒演說(shuō)智慧經(jīng)典(內(nèi)部筆記)
- 管道TOFD檢測(cè)記錄及續(xù)表
評(píng)論
0/150
提交評(píng)論