




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 CORBA 程序設(shè)計(jì)指南(入門(mén))那個(gè)地點(diǎn)假設(shè)你對(duì)CORBA毫無(wú)所知。對(duì)JAVA略有所知,因?yàn)槟莻€(gè)地點(diǎn)使用JAVA作為程序設(shè)計(jì)語(yǔ)言。學(xué)習(xí)了本書(shū),你將對(duì)CORBA有個(gè)初步了解,并能編寫(xiě)一個(gè)簡(jiǎn)單完整的CORBA應(yīng)用程序。CORBA 簡(jiǎn)介CORBA(Common Object Request Broker Architecture)是為了實(shí)現(xiàn)分布式計(jì)算而引入的。為了講明CORBA在分布計(jì)算上有何特點(diǎn),我們從它與其它幾種分布計(jì)算技術(shù)的比較中進(jìn)行講明。與過(guò)去的面向過(guò)程的RPC(Remote Procedure Call)不同,CORBA是基于面向?qū)ο蠹夹g(shù)的,它能解決遠(yuǎn)程對(duì)象之間的互操作問(wèn)題。MicroS
2、oft 的DCOM (Distributed Component Object Model)也是解決這一問(wèn)題的, 但它基于Windows操作系統(tǒng),盡管到本書(shū)編寫(xiě)時(shí),DCOM已有在其他操作系統(tǒng)如Sun Solaris, Digital Unix, IBM MVS 上的實(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ù)是Java RMI(Remote Method Invocation),但它只能用JAVA實(shí)現(xiàn)。CORBA與此不同,它通過(guò)一種叫IDL(Interface Definition Lan
3、guage)的接口定義語(yǔ)言,能做到語(yǔ)言無(wú)關(guān),也確實(shí)是講,任何語(yǔ)言都能制作CORBA組件,而CORBA組件能在任何語(yǔ)言下使用。 因此,能夠如此理解CORBA:CORBA一種異構(gòu)平臺(tái)下的語(yǔ)言無(wú)關(guān)的對(duì)象互操作模型。CORBA體系結(jié)構(gòu)CORBA的體系結(jié)構(gòu)如下:圖1.1 CORBA體系結(jié)構(gòu)CORBA上的服務(wù)用IDL描述,IDL將被映射為某種程序設(shè)計(jì)語(yǔ)言如C+或Java,同時(shí)分成兩分,在客戶方叫IDL Stub(樁), 在服務(wù)器方叫IDL Skeleton(骨架)。兩者能夠采納不同的語(yǔ)言。服務(wù)器方在Skeleton的基礎(chǔ)上編寫(xiě)對(duì)象實(shí)現(xiàn)(Object Implementation),而客戶方要訪問(wèn)服務(wù)器對(duì)象
4、上的方法,則要通過(guò)客戶樁。而雙方又要通過(guò)而ORB(Object Request Broker,對(duì)象請(qǐng)求代理)總線通信。與傳統(tǒng)的Client/Server模式(我們稱為T(mén)wo-tier client/server)不同,CORBA是一種multi-tier client/server architecture,更確切的講,是一種three-tier client/server模式。雙重客戶/服務(wù)器模式存在的問(wèn)題是兩者耦合太緊,它們之間采納一種私有協(xié)議通信,服務(wù)器的改變將阻礙到客戶方。多重客戶/服務(wù)器與此不同,兩者之間的通信不能直接進(jìn)行,而需要通過(guò)中間的一種叫代理的方式進(jìn)行。在CORBA中這種代理
5、確實(shí)是ORB。通過(guò)它,客戶和服務(wù)器不再關(guān)懷通信問(wèn)題,它們只需關(guān)懷功能上的實(shí)現(xiàn)。從那個(gè)意義上講,CORBA是一種中間件(Middleware)技術(shù)。下面列出CORBA中的一些重要概念,或者講CORBA中的幾個(gè)重要名詞,有助于讀者了解CORBA的一些重要的方面。CORBA中的幾個(gè)概念1.2.1 ORB(Object Request Broker)CORBA體系結(jié)構(gòu)的核心確實(shí)是ORB。能夠如此簡(jiǎn)單理解:ORB確實(shí)是使得客戶應(yīng)用程序能調(diào)用遠(yuǎn)端對(duì)象方法的一種機(jī)制。圖1.2 ORB模型具體來(lái)講確實(shí)是:當(dāng)客戶程序要調(diào)用遠(yuǎn)程對(duì)象上的方法時(shí),首先要得到那個(gè)遠(yuǎn)程對(duì)象的引用,之后就能夠像調(diào)用本地點(diǎn)法一樣調(diào)用遠(yuǎn)程對(duì)象
6、的方法。當(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ù)椒?wù)器方(實(shí)際上在同一臺(tái)機(jī)器上也如此),并通過(guò)將參數(shù)Unmarshaling的過(guò)程,傳到正確的對(duì)象上(這整個(gè)過(guò)程叫重定向,Redirecting),服務(wù)器對(duì)象完成處理后,ORB通過(guò)同樣的Marshaling/Unmarshaling方式將結(jié)果返回給客戶。因此,ORB是一種功能,它具備以下能力:1對(duì)象定位(依照對(duì)象引用定位對(duì)象的實(shí)現(xiàn))2
7、對(duì)象定位后,確信Server能同意請(qǐng)求3將客戶方請(qǐng)求通過(guò)Marshaling/Unmarshing方式重定向到服務(wù)器對(duì)象上4假如需要,將結(jié)果以同樣的方式返回。1.2.2 IDL(Interface Definition Language)IDL,接口定義語(yǔ)言,是CORBA體系中的另一個(gè)重要概念。假如講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上去。映射后的代碼叫Client Stub
8、 Code和 Server Skeleton Code。IDL的好處是使高層設(shè)計(jì)人員不必考慮實(shí)現(xiàn)細(xì)節(jié)而只需關(guān)懷功能描述。IDL能夠講是描述性語(yǔ)言。設(shè)計(jì)IDL的過(guò)程也是設(shè)計(jì)對(duì)象模型的過(guò)程。它是編寫(xiě)CORBA應(yīng)用的第一步,在整個(gè)軟件設(shè)計(jì)過(guò)程中至關(guān)重要。IDL的語(yǔ)法專門(mén)像C+,因此也像Java。專門(mén)難想像一個(gè)程序設(shè)計(jì)人員是不明白C或Java的,因此,幾乎所有的程序設(shè)計(jì)人員都能迅速理解IDL。而這正是IDL設(shè)計(jì)者所希望的。下面是一個(gè)IDL定義的簡(jiǎn)單例子:/ grid.idl/ IDL definition of a 2-D grid:module simpleDemointerface grid re
9、adonly attribute short height; / height of the grid readonly attribute short width; / width of the grid / IDL operations / set the element row,col of the grid, to value: void set(in short row, in short col, in long value); / return element row,col of the grid: long get(in short row, in short col); ;
10、This IDL defines an interface for a grid CORBA object that maintains a grid or 2-D array of data values, which a client can access or modify remotely. Module類似于Java中包(Package)的概念,實(shí)際上module simpleDemo映射到JAVA正是package simpleDemo。而Interface類似于C+中的類(classs)聲明,或是Java中的Interface 定義。附錄中列出了IDL的全部語(yǔ)法。1.2.3 St
11、ub Code 和 Skeleton CodeStub code 和Skeleton Code 是由IDL Complier自動(dòng)生成的,前者放在客戶方,后者放在服務(wù)器方。不同廠商的IDL complier生成的Stub 和Skeleton會(huì)略有區(qū)不,但阻礙不大。如上面的grid.idl, 編譯后,Stub Code包含以下文件:grid.java_gridStub.javagridHelper.javagridHolder.javagridOperations.javaSkeleton Code則包含以下文件: gridOperations.java gridPOA.java gridPOAT
12、ie.java(在Stud Code 也包含gridOperations.java, 是因?yàn)樵谑褂肅all back機(jī)制時(shí)會(huì)用到。)這些文件的用途后面會(huì)講到。 1.2.4 GIOP 和 IIOP我們明白,客戶和服務(wù)器是通過(guò)ORB交互的,那么,客戶方的ORB和服務(wù)器方的ORB又是通過(guò)什么方式通信呢?通過(guò)GIOP(General Inter-ORB Protocol)。也確實(shí)是講,GIOP是一種通信協(xié)議,它規(guī)定了兩個(gè)實(shí)體:客戶和服務(wù)器ORBs間的通信機(jī)制。 圖1.3 ORBs通信機(jī)制GIOP在設(shè)計(jì)時(shí)遵循以下目標(biāo):Widest possible availabilitySimplicityScala
13、bilityLow costGeneralityArchitectural neutrality也是講,GIOP設(shè)計(jì)的盡可能簡(jiǎn)單,開(kāi)銷最小,同時(shí)又具有最廣泛的適應(yīng)性和可擴(kuò)展性,以適應(yīng)不同的網(wǎng)絡(luò)。GIOP定義了以下幾個(gè)方面:1The Common Data Representation (CDR) definition.通用數(shù)據(jù)表示定義。它實(shí)際上是IDL數(shù)據(jù)類型在網(wǎng)上傳輸時(shí)的編碼方案。它對(duì)所有IDL數(shù)據(jù)類型的映射都作了規(guī)定。2GIOP Message Formats. 它規(guī)定了Client和Server兩個(gè)角色之間要傳輸?shù)南⒏袷健Ro包括Request和Reply兩種消息。一個(gè)Request
14、消息有以下幾部分組成: A GIOP message header A Request Header The Request Body相應(yīng)的,一個(gè)Reply消息則包括A GIOP message header A Reply Header The Reply BodyGIOP1.1規(guī)定 GIOP message header格式如下:/ GIOP 1.1struct MessageHeader_1_1 char magic 4;Version GIOP_version;octet flags; / GIOP 1.1 changeoctet message_type;unsigned long
15、message_size; Request Header格式如下:/ GIOP 1.1struct RequestHeader_1_1 IOP:ServiceContextList service_context;unsigned long request_id;boolean response_expected;octet reserved3; / Added in GIOP 1.1sequence object_key;string operation;Principal requesting_principal; Request Body則按CDR規(guī)定的方式編碼,它要緊對(duì)方法調(diào)用的參數(shù)進(jìn)
16、行編碼, 如方法: double example (in short m, inout Principal p); 可表示成:struct example_body short m; / leftmost in or inout parameterPrincipal p; / . to the rightmost;3GIOP Transport Assumptions:要緊規(guī)定在任何面向連接的網(wǎng)絡(luò)傳輸層上的一些操作規(guī)則。如:Asymmetrical connection usage,Request multiplexing,Overlapping requests,Connection man
17、agement等。另外,因?yàn)镃ORBA是基于對(duì)象的,GIOP還需定義一套Object Location的機(jī)制。GIOP因?yàn)槭且环N通用協(xié)議,因此不能直接使用。在不同的網(wǎng)絡(luò)上需要有不同的實(shí)現(xiàn)。目前使用最廣的便是Internet上的GIOP,稱為IIOP(Internet Inter-ORB Protocol)。IIOP基于TCP/IP協(xié)議。IIOP消息格式定義如下:module IIOP / IDL extended for version 1.1struct Version octet major;octet minor;struct ProfileBody_1_0 / renamed from
18、 ProfileBodyVersion iiop_version;string host;unsigned short port;sequence object_key;struct ProfileBody_1_1 Version iiop_version;string host;unsigned short port;sequence object_key;sequence components;1.2.5 Dynamic Invocation Interface (DII) 和 Dynamic Skeleton Interface (DSI)動(dòng)態(tài)調(diào)用接口(DII)和動(dòng)態(tài)骨架接口(DSI)是
19、用來(lái)支持客戶在不明白服務(wù)器對(duì)象的接口的情況下也能調(diào)用服務(wù)器對(duì)象。一個(gè)增加了DII和DSI的CORBA調(diào)用模型如下: 圖1.4 增加了DII和DSI的調(diào)用模型我們?cè)凇疤岣咂敝性僭敿?xì)講述DII和DSI。1.2.6 Object Adapter (對(duì)象適配器)對(duì)象適配器是ORB的一部分。它要緊完成對(duì)象引用的生成、維護(hù),對(duì)象定位等功能。對(duì)象適配器有各種各樣。Basic Object Adapter(BOA, 差不多對(duì)象適配器)實(shí)現(xiàn)了對(duì)象適配器的一些核心功能。而Portable Object Adapter(POA,可移植對(duì)象適配器)則力圖解決對(duì)象實(shí)現(xiàn)在不同廠商的ORBs下也能使用的問(wèn)題。最新的ORB
20、產(chǎn)品一般都支持POA。還有其他一些專有領(lǐng)域的對(duì)象適配器如Database Object Adapter等。CORBA歷史CORBA是由OMG(Object Management Group)負(fù)責(zé)制定和維護(hù)的一組規(guī)范。OMG成立于1989年,是一個(gè)非營(yíng)利的國(guó)際性軟件組織,要緊致力于為分布式計(jì)算提供解決方案并制定規(guī)范。除CORBA外,OMG還制定了如UML(United Modeling Language, 統(tǒng)一建模語(yǔ)言)、CWM等其他重要規(guī)范。OMG目前已有世界上760多個(gè)成員,東南大學(xué)是中國(guó)唯一的OMG成員。CORBA自1990提出并被OMG采納以來(lái),已歷經(jīng)多個(gè)版本。分不稱為 CORBA 1、
21、CORBA 2和CORBA 3。其中CORBA 1是對(duì)CORBA 1.x的統(tǒng)稱,CORBA 2是對(duì)CORBA 2.x的統(tǒng)稱。目前CORBA 3規(guī)范還在制訂中,不久便可面世。下面是CORBA版本的更新歷史。CORBA1 :CORBA 1.0 90-12, 提出CORBA框架CORBA 1.1 91早期,定義了IDL及ORB Interface。 CORBA 1.2 92-93, 修訂CORBA定義了ORB的一些差不多特性,然而沒(méi)有定義而ORB間的通用協(xié)議。CORBA 2要緊解決這一問(wèn)題。CORBA 2:CORBA 2.0 94-12, 定義了GIOP和IIOPCORBA 2.1 97-08COR
22、BA 2.2 98-02, 增加了POA。CORBA 2.3 98-12CORBA 2.3.1 99-10, 一些Change bars.CORBA 2.4 00-10, 具備CORBA 3的雛形,包括:QoS Specification, Asynchronous Messaging, Minimum CORBA, Real-Time CORBA, CORBAComponents, Notification Services, Firewall Specification等。CORBA 2.4.1 00-11CORBA 2.4.2 01-02因此,能夠講,CORBA 1提出ORB和IDL等C
23、ORBA差不多概念,CORBA 2要緊貢獻(xiàn)是IIOP,而在制訂中CORBA 3 則集中于CORBA Components技術(shù)及Real-time特性等。對(duì)CORBA的簡(jiǎn)要介紹就到那個(gè)地點(diǎn)。關(guān)于OMG及CORBA的更多信息,可訪問(wèn)OMG站點(diǎn): HYPERLINK .下面我們開(kāi)始編寫(xiě)第一個(gè)CORBA程序。2 使用Orbix 2000編寫(xiě)第一個(gè)CORBA程序在編寫(xiě)CORBA程序前,需要安裝CORBA環(huán)境。提供CORBA產(chǎn)品的廠商有專門(mén)多,那個(gè)地點(diǎn)我們采納IONA公司的Orbix 2000。IONA公司在CORBA領(lǐng)域一直處于領(lǐng)先地位,其產(chǎn)品幾乎總是和CORBA規(guī)范同時(shí)出臺(tái)。Orbix 2000是IO
24、NA公司2001年2月公布的最新產(chǎn)品,它具有Real-time特性,而這正是CORBA在電信領(lǐng)域應(yīng)用的最關(guān)鍵的特性之一。而程序設(shè)計(jì)語(yǔ)言采納JAVA。其開(kāi)發(fā)環(huán)境為JBuilder 4. JBuilder 4 是Enterprise 公司(原聞名的Boland公司)推出的最新JAVA集成開(kāi)發(fā)環(huán)境,其內(nèi)嵌JDK 1.3。2.1 安裝環(huán)境你需要安裝JAVA和CORBA ORB環(huán)境,前者使用JBuilder 4, 后者使用Orbix 2000。操作系統(tǒng)建議使用Windows 2000(Professional or Server),因?yàn)槲覀兒竺嫠v的一些配置工作是基于Windows 2000,和Wind
25、ows 98稍有區(qū)不。另外,Windows 2000也更為穩(wěn)定。2.1.1 安裝JavaOrbix 2000需要一個(gè)JDK環(huán)境。假如你安裝了JBuilder 4,能夠直接使用其所帶的JDK1.3。否則,你需要單獨(dú)安裝一個(gè)JDK。JDK是免費(fèi)的,你能夠下載一個(gè)較新的版本。JBuilder 4不是必需的。但我們建議你使用它,因?yàn)镴Builder 4 支持CORBA程序的編寫(xiě),除了能使用其自身的Visibroker(Enterprise公司自己的ORB)外,通過(guò)配置,還可直接使用Orbix。這對(duì)提高我們的開(kāi)發(fā)效率是專門(mén)有關(guān)心的。2.1.2 安裝Orbix 2000Orbix 2000安裝專門(mén)簡(jiǎn)單,按
26、照安裝步驟進(jìn)行即可。但要注意以下幾點(diǎn):盡量按缺省方式,如此能夠省去許多配置上的苦惱。如安裝路徑使用C:Program FilesIONA;使用典型安裝等。Orbix 2000同時(shí)支持JAVA和C,還帶有一個(gè)COMet Development Kit。只需安裝Orbix 2000 v1.2 Java Development Kit即可。圖 2.1 安裝 Orbix 2000 for Java安裝過(guò)程中,會(huì)提示輸入JDK的路徑,因此,最好先安裝JAVA。假設(shè)JBuilder 4安裝在C:JBuilder 4 目錄下,那么,在提示框中輸入C:JBuilder 4jdk1.3。Orbix 2000需要
27、license。License.txt文件中包含有所需的license.txt, 告訴安裝程序那個(gè)文件所在的位置,安裝程序會(huì)自動(dòng)讀取并安裝所需的license。圖 2.2 安裝 license最后,安裝程序會(huì)做一些配置工作,為使配置生效,你需要重啟機(jī)器。2.1.3 配置Orbix 2000為使Orbix 2000能正常工作,還需要做一些額外的配置工作,要緊是設(shè)置一些必需的環(huán)境變量。那個(gè)地點(diǎn)以Windows 2000為例。(Windows 98中需要在autoexec.bat中用相應(yīng)命令設(shè)置。)打開(kāi)Windows的操縱面板,找到“System”-“Advanced”-“Environment V
28、ariables”,如圖2.3所示。圖 2.3 配置環(huán)境變量“Environment Variables”分為兩部分:“User variables”和“System variables”。(以下標(biāo)*的環(huán)境參數(shù)是需要用戶自己配置的。其他參數(shù)安裝程序會(huì)自動(dòng)配置,但由于安裝不得當(dāng)或其他緣故,也可能不正確,那個(gè)地點(diǎn)列出來(lái),對(duì)比檢查一遍是否都正確。另外,我們假設(shè)程序安裝在C:Program FilesIONA目錄下,假如不是,作相應(yīng)改變。)1. User variables:1)CLASSPATH(*)在CLASSPATH的末尾添加以下路徑:C:Program FilesIONAorbix_art1.
29、2localhost; .;.classes(添加的部分與前面部分用分號(hào);隔開(kāi),下同)it_javac, it_java工具會(huì)在運(yùn)行時(shí)添加C:Program FilesIONAorbix_art1.2classes, 因此不必在那個(gè)地點(diǎn)設(shè)置。增加當(dāng)前目錄 . 和.classes會(huì)對(duì)你工作帶來(lái)便利。 2)PATH 在末尾增加 C:Program FilesIONAbin 如此你能夠在任何目錄運(yùn)行Orbix2000的命令了。2System variables:1)IT_PRODUCT_DIR (*)假如沒(méi)有IT_PRODUCT_DIR,單擊”new”按鈕,添加它,其值設(shè)置為 C:Program F
30、ilesIONA,也即程序安裝路徑。那個(gè)參數(shù)特不重要,Orbix自動(dòng)設(shè)置其他關(guān)于目錄的參數(shù)時(shí)都基于它。2)JAVA_HOME (*) 添加JAVA_HOME,設(shè)置為C:JBuilder4jdk1.3,或其他JDK路徑。it_javac和it_java的運(yùn)行需要它。3)PATH增加C:Program FilesIONAbinUser variables 和System variables中只需設(shè)置一個(gè)就行,因此都設(shè)置也無(wú)妨。4)IT_IDL_CONFIG_FILE(*)idl compiler工具需要那個(gè)參數(shù),添加那個(gè)參數(shù),設(shè)置為C:Program FilesIONAorbix_art1.2et
31、c在開(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)龐大的JBuilder 4。 后面我們?cè)俳榻B在JBuilder 4集成開(kāi)發(fā)環(huán)境下的使用方法。實(shí)際上兩者步驟是類似的,只是方便程度不一樣。通常,開(kāi)發(fā)一個(gè)CORBA應(yīng)用的大致步驟如下:1)定義 IDL。2)用IDL complier 將IDL編譯成 Client Stub 代碼和 Server Sk
32、eleton代碼。3)編寫(xiě)Server方的實(shí)現(xiàn)(Implementation)代碼。4)編寫(xiě) Server。5)編寫(xiě) Client。6)編譯和調(diào)試。7)運(yùn)行程序。編寫(xiě)Server Implementation和編寫(xiě)Server不是一回事。Server和Client差不多上帶有main()函數(shù)的可執(zhí)行的程序。但Server Implementation 是對(duì)interface的實(shí)現(xiàn),它能夠單獨(dú)放在一個(gè).java文件中,也能夠和Server放在同一個(gè)文件中。下面以一個(gè)簡(jiǎn)單的例子詳細(xì)講解各個(gè)步驟。第一步:定義IDL首先建立一個(gè)工作目錄,那個(gè)地點(diǎn)假設(shè)為D:myworksimpleDemo。然后編寫(xiě)ID
33、L。那個(gè)例子我們使用1.2.1 節(jié)中g(shù)rid.idl,一個(gè)對(duì)二維數(shù)組操作的例子。能夠使用任何文本編輯器編寫(xiě),如UltraEdit等。之后保存到D:myworksimpleDemo下。grid.idl定義了一個(gè)接口interface grid。其中定義兩個(gè)方法get()和set(),用以獵取和設(shè)置數(shù)組元素值。注意屬性(attribute)的定義,這是C和JAVA中沒(méi)有的概念(在Delphi中有那個(gè)概念),實(shí)際上它就相當(dāng)于類的數(shù)據(jù)定義,但在映射到Java時(shí)被映射成方法。第二步:編譯IDL 為Java Stub和Skeleton.打開(kāi)DOS窗口,進(jìn)入到D:myworksimpleDemo目錄,在Do
34、s命令提示符下鍵入:idl jbase jpoa grid.idl參數(shù)-jbase表示生成java stub code,參數(shù)jpoa 表示生成java skeleton code,在Orbix 2000中,骨架代碼使用POA方式。缺省情況下idl編譯器會(huì)創(chuàng)建一個(gè)java_output的目錄,假如idl中有module定義,還會(huì)生成與此module同名的子目錄,并將編譯后生成的.java程序放在此目錄中。你能夠開(kāi)關(guān)參數(shù)操縱編譯方式,例如,假如想將客戶stub和服務(wù)器skeleton代碼分開(kāi),能夠鍵入:idl jbase:-Oclient grid.idlidl jpoa:-Oserver gri
35、d.idl-O 參數(shù)操縱輸出目錄。編譯器會(huì)自動(dòng)生成client和server目錄,并將代碼分不放在這目錄中。我們明白,idl編譯器會(huì)將module映射成package,缺省情況下,module simpleDemo映射成package simpleDemo。假如想自己操縱package的生成,例如要生成package demos.simpleDemo 形式的包,能夠:idl jbase:-Oclient jbase:-Pdemos grid.idl編譯器會(huì)在module指定的包前再加上-P參數(shù)指定的包前綴,即生成package demos.simpleDemo。注意不要寫(xiě)成-Pdemos.si
36、mpleDemo,否則會(huì)生成package demos.simpleDemo.simpleDemo。附錄B中列出了idl命令的用法。注意,我們看看idl生成的stub和skeleton代碼。Stub Code包含以下文件:grid.java 定義了接口 interface grid,public interface grid extends gridOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity 直接由grid.idl中的interface grid 映射而來(lái)。_gridStub.java 樁代碼,定義了cl
37、ass _gridStub public class _gridStub extends org.omg.CORBA.portable.ObjectImpl implements gridpublic void set() ;pubic int get().;class _gridStub中實(shí)現(xiàn)了客戶方的set()和get()等方法,它們封裝了ORB的功能,截取客戶的調(diào)用,執(zhí)行Marshaling/Unmarshing等操作,最終得到調(diào)用結(jié)果。也確實(shí)是講,在客戶方聲明一個(gè)grid類型的對(duì)象,實(shí)際上使用gridHelper操作得到的是一個(gè)_gridStub類型的實(shí)例,調(diào)用grid上的方法實(shí)際上是
38、調(diào)用_gridStub上的方法。gridHelper.java 定義 public class gridHelper 關(guān)心客戶方grid對(duì)象生成一個(gè)_gridStub類型的實(shí)例,同時(shí)得到服務(wù)器對(duì)象的引用。gridHolder.java 定義public final class gridHolder implements org.omg.CORBA.portable.Streamable當(dāng)需要處理out,inout類型的參數(shù)時(shí),需要那個(gè)類。gridOperations.java 定義public interface gridOperations void set() int get() 那個(gè)接口
39、實(shí)際上是Server使用的。當(dāng)客戶方需要使用callback功能時(shí),也需要那個(gè)接口。Skeleton Code則包含以下文件: gridPOA.java 定義類abstract public class gridPOA extends org.omg.PortableServer.Servant implements org.omg.CORBA.portable.InvokeHandler, gridOperations Server方的Implementation代碼直接繼承自那個(gè)類。 gridPOATie.java 定義類public class gridPOATie extends si
40、mpleDemo.gridPOA當(dāng)使用代理方式而不是繼承方式創(chuàng)建Server Object時(shí),使用那個(gè)類。 -jpoa 參數(shù)只生成上述兩個(gè)文件,實(shí)際上Skeleton Code也包含gridOperations.java,因?yàn)閏lass gridPOA確實(shí)是實(shí)現(xiàn)gridOperations的。上述接口(類)的繼承關(guān)系如下:grid.idl中只定義了一個(gè)interface grid,實(shí)際上假如定義了多個(gè)interface, 那么對(duì)每個(gè)interface都會(huì)生成和上面類似的一套代碼。第三步:編寫(xiě)Server方的Implementation代碼(即編寫(xiě)Servant)到現(xiàn)在為止,我們才開(kāi)始真正編寫(xiě)代
41、碼。引入了POA概念后,Server方的實(shí)現(xiàn)對(duì)象稱為Servant, 編寫(xiě)Implementation代碼實(shí)際上確實(shí)是對(duì)IDL定義的每個(gè)interface,都編寫(xiě)一個(gè)Servant,其中要現(xiàn)實(shí)interface中定義的每個(gè)方法。.那個(gè)地點(diǎn)我們將Servant類定義為class gridImpl,類名字能夠自己隨便取,通常都命名為xxxImpl的形式。Class gridImpl直接繼承自gridPOA。在D:myworksimpleDemo目錄下創(chuàng)建一個(gè)gridImpl.java文件,內(nèi)容如下:package simpleDemo;public class gridImpl extends g
42、ridPOA short m_height; / store the height short m_width; / store the width int m_array; / a 2D array to hold the grid data private int i=0; private int j=0; private int n=0; public gridImpl(short width, short height) m_array = new intwidthheight; / allocate the 2D array m_height = height; / set up h
43、eight m_width = width; / set up width /* * Implementation of the method which reads the height attribute */ public short height() return m_height; /* * Implementation of the method which reads the width attribute */ public short width() return m_width; /* * Implementation of the set operation */ pub
44、lic void set (short x, short y, int value) i+; n+; System.out.println (- +n+ Server / +i+ grid.set()-); System.out.println (In grid.set() x = + x); System.out.println (In grid.set() y = + y); System.out.println (In grid.set() value = + value); m_arrayyx = value; /* * Implementation of the get operat
45、ion */ public int get (short x, short y) j+; n+; System.out.println (- +n+ Server / +j+ : grid.get()-); int value = m_arrayyx; System.out.println (In grid.get() x = + x); System.out.println (In grid.get() y = + y); System.out.println (In grid.get() value = + value); return value; 編寫(xiě)好Implementation代碼
46、后,實(shí)際上你就能夠編譯了。使用it_javac 命令進(jìn)行編譯。在編譯gridImpl.java之前,請(qǐng)先編譯idl生成的stub和skeleton代碼。轉(zhuǎn)到D:myworksimpleDemo,用mkdir classes建立一個(gè)目錄d:myworksimpleDeomclasses, 我們編譯后的class文件都放在那個(gè)目錄下。編譯樁和骨架代碼。轉(zhuǎn)到D:myworksimpleDemojava_outputsimpleDemo目錄,鍵入命令:it_javac d d:myworksimpleDemoclasses *.java(-d 參數(shù)指明編譯后的class文件的輸出目錄,因?yàn)?java中
47、指定了包名simpleDemo,會(huì)自動(dòng)創(chuàng)建一個(gè)simpleDemo子目錄,.class文件放在此子目錄中。)編譯gridImpl.java。轉(zhuǎn)到D:myworksimpleDemo, 鍵入命令:it_javac classpath .classes d classes gridImpl.java。(-classpath 指明gridImpl.java要用到的其他類文件,因?yàn)間ridImpl.java中用到了骨架文件中的類,也即第2)步所編譯的文件,因此需要用-classpath指明。)鍵入it_javac能夠查看此命令的關(guān)心。it_javac實(shí)際上依舊調(diào)用jdk的javac進(jìn)行編譯的,需要用參
48、數(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路徑而可不能覆蓋已有的CLASSPATH值。it_javac會(huì)將這些值全部傳遞給JAVA_HOME指定的javac編譯器。第四步
49、:編寫(xiě)ServerServant僅是實(shí)現(xiàn)代碼,而Server是包含main()函數(shù)的可執(zhí)行的代碼。Server的要緊任務(wù)確實(shí)是創(chuàng)建所需的Servant,同時(shí)通知POA已預(yù)備就緒,能夠同意客戶方的請(qǐng)求。新建一個(gè)文件gridServer.java,放在D:myworksimpleDemo下,代碼如下:package simpleDemo;import java.io.*;import org.omg.CORBA.*;import org.omg.PortableServer.*;public class gridServer public static ORB global_orb; public
50、 static void main(String args) final short width = 100; final short height = 100; / 1. Initalise ORB for an application and resolve RootPOA reference try System.out.println(Initializing the ORB); global_orb = ORB.init (args,null); org.omg.CORBA.Object poa_obj = global_orb.resolve_initial_references(
51、RootPOA); org.omg.PortableServer.POA root_poa = org.omg.PortableServer.POAHelper.narrow(poa_obj); / 2. Create servants, activate them, write their IORs to files. / System.out.println(Creating objects); gridImpl grid=new gridImpl(width,height); byte grid_oid = root_poa.activate_object(grid); export_o
52、bject(root_poa, grid_oid, ./grid.ior, gridHelper.id(); / 3. Activate the POA Manager to allow new requests to arrive / System.out.println(Activating the POA Manager); org.omg.PortableServer.POAManager poa_manager = root_poa.the_POAManager(); poa_manager.activate(); / 4. Give control to the ORB to le
53、t it process incoming requests / System.out.println(Giving control to the ORB to process requests); global_orb.run(); System.out.println (Done); catch(org.omg.CORBA.ORBPackage.InvalidName ex) System.out.println(Failed to obtain root poa + ex ); catch(org.omg.PortableServer.POAPackage.WrongPolicy ex)
54、 System.out.println(Invalid POA policy + ex ); catch(org.omg.PortableServer.POAPackage.ServantAlreadyActive ex) System.out.println(POA servant already active + ex ); catch(org.omg.PortableServer.POAManagerPackage.AdapterInactive ex) System.out.println(POAManager activate failed + ex ); System.out.pr
55、intln(gridServer exiting.); /* * This function takes a poa and object id, builds an object * reference representing that object, and exports the object * reference to a file. */ public static void export_object(POA poa, byte oid, String filename, String type_id) try org.omg.CORBA.Object ref = poa.cr
56、eate_reference_with_id(oid, type_id); String stringified_ref = global_orb.object_to_string(ref); RandomAccessFile FileStream = null; try FileStream = new RandomAccessFile(filename,rw); FileStream.writeBytes(stringified_ref); FileStream.close(); catch(Exception ex) System.out.println(Failed to write
57、to + filename ); catch(org.omg.PortableServer.POAPackage.WrongPolicy ex) System.out.println(Invalid POA policy + ex ); 通常,一個(gè)Server主程序執(zhí)行以下幾個(gè)步驟:初始化ORB;創(chuàng)建Servant對(duì)象;激活POA治理器;通知ORB預(yù)備同意請(qǐng)求。只有第二步是需要用戶編寫(xiě)的,其他步驟所有Server程序都大致一樣。在創(chuàng)建Servant對(duì)象后還需注冊(cè)其引用,那個(gè)地點(diǎn)我們使用了將其引用保留到文件中的方法(file based)。方法export_object()用來(lái)完成這一個(gè)工作,這
58、是我們自己定義的,實(shí)際上能夠作為一個(gè)通用方法使用在所有Server程序中使用。當(dāng)客戶方Orbix 2000提供了兩種獵取對(duì)象引用的方式,一種叫file based,即讀取文件的方式;一種叫Naming Service,即通常所講的命名服務(wù)。前一種方式的好處是不需要啟動(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)用中,通常使用Naming Servic,它的不足是需要啟動(dòng)Naming Service守護(hù)進(jìn)程,這
59、對(duì)其健壯性要求專門(mén)高,可能成為系統(tǒng)瓶頸。第五步:編寫(xiě)ClientClient程序確實(shí)是客戶方的可執(zhí)行程序,它需要使用到Server方的服務(wù)。新建一個(gè)文件gridClient.java,保存到D:myworksimpleDemo,源代碼如下:package simpleDemo;import java.io.*;import org.omg.CORBA.*;/* * The javaclient will connect to the Grid server and invoke * operations enabling it to manipulate a 2 dimensional arr
60、ay. */public class gridClient public static void main (String args) System.out.println (The Client begin.n); ORB orb=null; grid gridProxy = null; grid gridProxy2=null; org.omg.CORBA.Object obj_ref=null; /* * Initalise the ORB for an Orbix application. */ try orb=ORB.init (args,null); /* * Establish
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動(dòng)合同范本002
- 中標(biāo)人支付合同范本
- 割草合同范例
- 印章保管合同范本律師
- 發(fā)電機(jī)保養(yǎng)合同范本
- 合資做房子合同范例
- 到期不住合同范本
- 醫(yī)院工程材料采購(gòu)合同范本
- 廠房阻力合同范本
- 人贅婿合同范本
- 個(gè)人應(yīng)聘簡(jiǎn)歷電工
- 2025年上半年河南省高校畢業(yè)生“三支一扶”招募1100人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 高血壓的用藥指導(dǎo)任務(wù)三高血壓的藥物治療講解
- 《馬云創(chuàng)業(yè)經(jīng)歷》課件
- 云南省大理白族自治州2024-2025學(xué)年八年級(jí)上學(xué)期1月期末考試英語(yǔ)試卷(無(wú)答案)
- 無(wú)人機(jī)行業(yè)市場(chǎng)分析指南
- 踇外翻病人護(hù)理查房
- 廣西河池市(2024年-2025年小學(xué)六年級(jí)語(yǔ)文)統(tǒng)編版專題練習(xí)(上學(xué)期)試卷及答案
- 施工安全管理培訓(xùn)資料
- 2024中考物理真題匯編:電與磁(含解析)
- 中建10t龍門(mén)吊安拆安全專項(xiàng)施工方案
評(píng)論
0/150
提交評(píng)論