亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 探索 corba 技術(shù)的應(yīng)用領(lǐng)域.htm

?? 寫給JSP初級程序員的書
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
<BODY bgColor=#ffffff text=#000000>
<table>
  <TBODY>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT  size=3>探索 CORBA 技術(shù)的應(yīng)用領(lǐng)域 <BR><FONT 
      size=2> </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300>6&nbsp;月份,我們談過您為什么要使用&nbsp;CORBA&nbsp;和&nbsp;Java&nbsp;技術(shù)。本月,我要通過一個可用的簡單示例,讓您開始探索&nbsp;CORBA&nbsp;技術(shù)的許多領(lǐng)域。不過,別忘了我們的目標(biāo)是,創(chuàng)建這樣一種分布式應(yīng)用程序:使駐留在一臺計算機(jī)上的客戶機(jī)能向運(yùn)行于另一臺計算機(jī)上的服務(wù)發(fā)出請求。我們不想為諸如硬件或操作系統(tǒng)軟件等細(xì)節(jié)問題操心,而只是想讓這種服務(wù)能響應(yīng)客戶機(jī)的請求。<BR><BR>  IDL&nbsp;接口&nbsp;<BR><BR>  全部&nbsp;CORBA&nbsp;結(jié)構(gòu)是從一個接口開始的,理解接口的最佳方法就是想像我的汽車,對,我的汽車。雖然您不熟悉它,但如果我對您說:“開上我的車,帶些三明治回來當(dāng)午餐”,恐怕您就不會懷疑自己能不能駕駛我的汽車。您可能想知道它停在哪里,以及開它是否安全,但是您會確信開我的車與開您的車差別不大。這是因?yàn)椋诟鞣N汽車當(dāng)中,人與汽車之間的接口已高度標(biāo)準(zhǔn)化了。我的轎車和您的跑車之間可能會有一些差異,但汽車的油門踏板、剎車和方向盤的安裝都是標(biāo)準(zhǔn)的,您一定能輕松快速上路。<BR><BR>  因?yàn)?amp;nbsp;CORBA&nbsp;與語言無關(guān),所以它依靠一種接口定義語言&nbsp;(IDL),來表達(dá)客戶機(jī)如何向?qū)崿F(xiàn)接口的服務(wù)發(fā)出請求。我們的接口就是一個方法:add()。這個方法將取兩個數(shù)(兩個&nbsp;IDL&nbsp;的&nbsp;long&nbsp;型數(shù))并返回這兩個數(shù)之和。下面是我們的接口計算程序:<BR><BR>清單&nbsp;1.&nbsp;calcsimpl.idl&nbsp;<BR>module&nbsp;corbasem&nbsp;{<BR> module&nbsp;gen&nbsp;{<BR>  module&nbsp;calcsimpl&nbsp;{<BR>    interface&nbsp;calculator&nbsp;{<BR>     long&nbsp;add(in&nbsp;long&nbsp;x,&nbsp;in&nbsp;long&nbsp;y);<BR>    };<BR>  };<BR> };<BR>};<BR>&nbsp;<BR><BR>  這個接口中的&nbsp;IDL&nbsp;關(guān)鍵字有:module、interface、long&nbsp;和&nbsp;in。IDL&nbsp;使用關(guān)鍵字&nbsp;module&nbsp;來創(chuàng)建名稱空間,并且此關(guān)鍵字準(zhǔn)確地映射為&nbsp;Java&nbsp;關(guān)鍵字&nbsp;package。運(yùn)行&nbsp;IDL-to-Java&nbsp;編譯器時,生成的&nbsp;Java&nbsp;文件將會存到名為&nbsp;calcsimpl&nbsp;的子目錄中。IDL&nbsp;關(guān)鍵字&nbsp;interface&nbsp;完美地映射為&nbsp;Java&nbsp;接口,并代表一種抽象類型,因?yàn)閮烧叨贾欢x您與對象通訊的方式,而不涉及對象的實(shí)現(xiàn)。IDL&nbsp;關(guān)鍵字&nbsp;long&nbsp;是一種基本的整數(shù)類型,它至少映射為一個&nbsp;4&nbsp;字節(jié)的類型,這種類型在&nbsp;Java&nbsp;代碼中就是&nbsp;int。<BR><BR>  想一想執(zhí)行遠(yuǎn)程方法調(diào)用的機(jī)制,您就會發(fā)現(xiàn)定義參數(shù)傳遞的方向(客戶機(jī)到服務(wù)器、服務(wù)器到客戶機(jī)或者雙向傳遞)是多么的有意義。在&nbsp;IDL&nbsp;操作中,這些方向用&nbsp;in、out&nbsp;和&nbsp;inout&nbsp;關(guān)鍵字來聲明,每個參數(shù)都必須聲明方向,以便使對象請求代理程序&nbsp;(ORB)&nbsp;知道該參數(shù)的去向。這會影響到為發(fā)送而進(jìn)行的參數(shù)打包、參數(shù)解包以及內(nèi)存管理。ORB&nbsp;對參數(shù)了解得越多,它的效率就越高。關(guān)鍵字&nbsp;in&nbsp;表明&nbsp;long&nbsp;x&nbsp;和&nbsp;long&nbsp;y&nbsp;是從客戶機(jī)傳遞到服務(wù)器。<BR><BR>圖&nbsp;1.&nbsp;參與&nbsp;CORBA&nbsp;請求的各個部分<BR><BR><IMG 
      src="1418520011012232jt.gif"></IMG>&nbsp;<BR><BR>IDL&nbsp;編譯器&nbsp;需要&nbsp;IDL&nbsp;編譯器嗎?&nbsp;<BR><BR>  您可能已經(jīng)有了&nbsp;ORB&nbsp;供應(yīng)商和&nbsp;IDL-to-Java&nbsp;編譯器。但如果還沒有,您從哪里獲取呢?這里有好多,而且有些還可以免費(fèi)下載。我推薦&nbsp;Object&nbsp;Oriented&nbsp;Concepts,&nbsp;Inc.&nbsp;的&nbsp;Orbacus&nbsp;ORB。如果不將其用于商業(yè)目的,它還可以免費(fèi)下載,而且完全符合&nbsp;CORBA&nbsp;2.3&nbsp;規(guī)范。另外一個可試用&nbsp;60&nbsp;天的編譯器是&nbsp;Inprise&nbsp;的&nbsp;Visibroker,也完全符合&nbsp;CORBA&nbsp;2.3&nbsp;規(guī)范并且可下載。如想獲得這兩種產(chǎn)品,請參閱參考資料。<BR><BR>  接口定義以后,必須在&nbsp;ORB&nbsp;供應(yīng)商提供的&nbsp;IDL-to-Java&nbsp;編譯器上運(yùn)行。IDL&nbsp;編譯器是一種精巧的實(shí)用程序,它生成&nbsp;IDL&nbsp;的&nbsp;stub&nbsp;和&nbsp;skeleton&nbsp;以及其它支持文件。生成的這些源文件,大部分將增強(qiáng)&nbsp;CORBA&nbsp;標(biāo)準(zhǔn)中定義的特定&nbsp;IDL&nbsp;類型的打包功能。編譯器將生成大部分網(wǎng)絡(luò)探測&nbsp;(plumbing),這在分布式系統(tǒng)中非常重要。在最基本的級別中,IDL-to-Java&nbsp;編譯器只是一個按&nbsp;CORBA&nbsp;2.3&nbsp;規(guī)范的定義來實(shí)現(xiàn)從&nbsp;IDL&nbsp;到&nbsp;Java&nbsp;語言映射的程序。手動生成這些代碼既枯燥又費(fèi)時,還容易出錯;IDL-to-Java&nbsp;編譯器會處理這一切,所以您就不用操心啦;同時,它會用一定的規(guī)則約束您,并強(qiáng)制您執(zhí)行封裝。IDL-to-Java&nbsp;編譯器將把&nbsp;CORBA-land&nbsp;規(guī)則強(qiáng)加給您的系統(tǒng)。<BR><BR>  輸入下面的命令,從&nbsp;Orbacus&nbsp;執(zhí)行&nbsp;IDL-to-Java&nbsp;編譯器,把所有生成的文件都放在&nbsp;CLASSPATH&nbsp;的輸出目錄下。<BR><BR>清單&nbsp;2.&nbsp;調(diào)用&nbsp;IDL-to-Java&nbsp;編譯器<BR>jidl&nbsp;--output-dir&nbsp;c:\_work\corbasem&nbsp;calculator.idl&nbsp;<BR><BR>  生成了什么呢?這個命令生成了構(gòu)建實(shí)現(xiàn)所需要的全部&nbsp;Java&nbsp;源文件。IDL-to-Java&nbsp;編譯器可確保所定義的接口遵守&nbsp;CORBA&nbsp;規(guī)范的規(guī)則。<BR><BR>圖&nbsp;2.&nbsp;IDL-to-Java&nbsp;編譯器文件生成<BR><BR><IMG 
      src="1798820011012232jt2.gif"></IMG><BR>下面是這些文件:&nbsp;<BR><BR>   calculator.java&nbsp;-&nbsp;這個文件叫標(biāo)記接口文件。CORBA&nbsp;規(guī)范指出這個文件必須擴(kuò)展&nbsp;IDLEntity,并且與&nbsp;IDL&nbsp;接口同名。這個文件提供類型標(biāo)記,從而使這個接口能用于其它接口的方法聲明。&nbsp;<BR><BR>   calculatorOperations.java&nbsp;-&nbsp;這個文件內(nèi)含&nbsp;Java&nbsp;公共接口&nbsp;--&nbsp;calculatorOperations。規(guī)范指出,這個文件應(yīng)該與具有&nbsp;Operations&nbsp;后綴的&nbsp;IDL&nbsp;接口同名,并且這個文件內(nèi)含此接口映射的操作標(biāo)記。上面定義的標(biāo)記接口&nbsp;(calculator.java)&nbsp;可擴(kuò)展這個接口。&nbsp;<BR><BR>   calculatorHelper.java&nbsp;-&nbsp;設(shè)計&nbsp;helper&nbsp;類的目的是,讓所需要的許多內(nèi)務(wù)處理功能脫離我們的接口,但又隨時可用到實(shí)現(xiàn)過程中。幫助程序文件含有重要的靜態(tài)&nbsp;narrow&nbsp;方法,這種方法使&nbsp;org.omg.CORBA.Object&nbsp;收縮為一種更具體的類型的對象引用;在這種情況下,將是一個計算程序類型。&nbsp;<BR><BR>   calculatorHolder.java&nbsp;-&nbsp;holder&nbsp;類是一個專門化類,是為了需要通過引用來傳遞參數(shù)的任意數(shù)據(jù)類型而生成的。這個示例中將不使用&nbsp;holder&nbsp;類,但我們將會在以后的欄目中經(jīng)常見到它。&nbsp;<BR><BR>   calculatorPOA.java&nbsp;-&nbsp;skeleton&nbsp;類為&nbsp;CORBA&nbsp;功能提供了請求-響應(yīng)探測的一大部分。生成&nbsp;calculatorPOA.java,是因?yàn)槿笔》绞较碌膶?shí)現(xiàn)是基于繼承的,如果我們選擇基于委托的實(shí)現(xiàn)方式,輸出就會不一樣。這些主題將在以后的欄目中詳細(xì)介紹。&nbsp;<BR><BR>   _calculatorStub.java&nbsp;-&nbsp;顧名思義,這是一個&nbsp;stub&nbsp;類。您的客戶機(jī)將需要這個類來進(jìn)行工作。<BR><BR><BR>服務(wù)器&nbsp;<BR><BR>  現(xiàn)在生成的文件必須在服務(wù)器上開始工作,用這個服務(wù)器實(shí)現(xiàn)我們的接口。所幸的是,大部分探測是適合我們的要求的,但別高興得太早&nbsp;--&nbsp;還有許多工作要做;就是說,所有這些文件都必須用在正確的地方。<BR><BR>  讓我們從&nbsp;add()&nbsp;方法的實(shí)現(xiàn)開始。(您可以下載完整的&nbsp;SimpleCalcSvr.java&nbsp;文件。)<BR><BR>清單&nbsp;3.&nbsp;SimpleCalcSvr.java&nbsp;--&nbsp;add()&nbsp;方法&nbsp;<BR>SimpleCalcServant&nbsp;extends&nbsp;calculatorPOA&nbsp;{<BR>  public&nbsp;int&nbsp;add(int&nbsp;x,&nbsp;int&nbsp;y)&nbsp;{<BR>    return&nbsp;x&nbsp;+&nbsp;y;<BR>  }<BR>}<BR>&nbsp;<BR><BR>  請注意,我們的實(shí)現(xiàn)類擴(kuò)展了已生成的類&nbsp;calculatorPOA。從客戶機(jī)發(fā)來一個請求時,該請求通過&nbsp;ORB&nbsp;進(jìn)入&nbsp;skeleton,skeleton&nbsp;最終將調(diào)用&nbsp;SimpleCalcServant,來完成請求并啟動響應(yīng)。我們的接口很簡單,所以我們的實(shí)現(xiàn)也很簡單。<BR><BR>  服務(wù)器其余部分的實(shí)現(xiàn),涉及如何圍繞這個接口實(shí)現(xiàn)來設(shè)置&nbsp;CORBA&nbsp;體系結(jié)構(gòu),由于可移植性和靈活性方面的原因,許多這些調(diào)用要按&nbsp;CORBA&nbsp;規(guī)范執(zhí)行。<BR><BR>  我們需要完成的第一項任務(wù)是,詳細(xì)說明要使用哪一個&nbsp;ORB,然后予以初始化。下面的代碼(文件&nbsp;SimpleCalcSvr.java&nbsp;的第&nbsp;18&nbsp;行到第&nbsp;29&nbsp;行)處理此任務(wù):<BR><BR>清單&nbsp;4.&nbsp;SimpleCalcSvr.java&nbsp;--&nbsp;初始化&nbsp;ORB&nbsp;<BR>java.util.Properties&nbsp;props&nbsp;=&nbsp;System.getProperties();<BR>props.put("org.omg.CORBA.ORBClass",<BR>"com.ooc.CORBA.ORG");<BR>props.put("org.omg.CORBA.ORBSingletonClass",<BR>"com.ooc.CORBA.ORBSingleton");<BR><BR>org.omg.CORBA.ORB&nbsp;orb&nbsp;=&nbsp;null;<BR>//&nbsp;初始化&nbsp;ORB<BR>orb&nbsp;=&nbsp;org.omg.CORBA.ORB.init(args,&nbsp;props);&nbsp;<BR><BR>&nbsp;<BR><BR>  初始化&nbsp;ORB&nbsp;時,需要準(zhǔn)確地告訴它哪一個類將用作&nbsp;ORBClass,哪一個類將用作&nbsp;ORBSingleton&nbsp;類。我們的實(shí)現(xiàn)將不考慮這些,但所有相關(guān)的探測則都將考慮這些。正如我前面所說的,這種情況下,我使用的是&nbsp;Object&nbsp;Oriented&nbsp;Concepts,&nbsp;Inc.&nbsp;的&nbsp;Orbacus&nbsp;ORB,而&nbsp;OOC&nbsp;類在那兩個&nbsp;props.put()&nbsp;調(diào)用中已給出。一旦填入了屬性,props&nbsp;就只作為一個參數(shù)傳遞給&nbsp;ORB.init()&nbsp;方法。實(shí)際情況可能不是這樣;如果我們要把這個服務(wù)器移到另一個&nbsp;ORB,不希望為服務(wù)器重新編碼。所以,在理想情況下,我們寧愿改變一個配置文件,使之指向另一個&nbsp;ORB&nbsp;類,然后直接重新啟動。<BR><BR>  現(xiàn)在,ORB&nbsp;已經(jīng)到位并已初始化,并且實(shí)現(xiàn)也已經(jīng)到位,只是尚未創(chuàng)建,此時,需要為實(shí)現(xiàn)創(chuàng)建一個完善的生存地點(diǎn),而這可不像聽起來那么容易,在一個分布式環(huán)境中,各個實(shí)現(xiàn)要求的環(huán)境可能略有不同。可以賦予實(shí)現(xiàn)許多特征。實(shí)現(xiàn)既可以是單線程的,也可以是多線程的;既可以是具有高度可伸縮性的對象池,也可以是單元素。這許多不同的服務(wù)器特征已產(chǎn)生了可移植對象適配器&nbsp;(POA)。POA&nbsp;使我們可以創(chuàng)建完善的環(huán)境,供我們的實(shí)現(xiàn)在其中駐留。所有符合&nbsp;2.3&nbsp;規(guī)范的&nbsp;ORB&nbsp;都會有一個根&nbsp;POA,所有其它&nbsp;POA&nbsp;都是從根&nbsp;POA&nbsp;創(chuàng)建的。在這個簡單示例中,我已將實(shí)現(xiàn)專用的代碼分解為它自己的方法&nbsp;runcalc()。<BR><BR>  為實(shí)現(xiàn)創(chuàng)建一個環(huán)境將是我們的第一項任務(wù),所以必須設(shè)置一個&nbsp;POA。本來,CORBA&nbsp;服務(wù)器使用基本對象適配器&nbsp;(BOA),但是每個供應(yīng)商的&nbsp;BOA&nbsp;都不一樣,在最新版本的&nbsp;CORBA&nbsp;規(guī)范中,POA&nbsp;已完全取代了&nbsp;BOA。<BR><BR>  清單&nbsp;5.&nbsp;SimpleCalcSvr.java&nbsp;--&nbsp;設(shè)置&nbsp;POA&nbsp;<BR>//&nbsp;從始終存在的&nbsp;rootPOA<BR>//&nbsp;設(shè)置可移植對象適配器<BR>org.omg.PortableServer.POA&nbsp;rootPOA&nbsp;=&nbsp;<BR>    org.omg.PortableServer.POAHelper.narrow(<BR>    orb.resolve_initial_references("RootPOA"));<BR><BR>org.omg.PortableServer.POAManager&nbsp;manager&nbsp;=<BR>    rootPOA.the_POAManager();<BR>&nbsp;<BR><BR>  從標(biāo)題和定義可以看出,這是一個簡單的示例。使用根&nbsp;POA&nbsp;而不創(chuàng)建新的&nbsp;POA,將使事情變得簡單。POA&nbsp;管理器是一種封裝了&nbsp;POA&nbsp;處理狀態(tài)的對象,所以,我們使用&nbsp;POA&nbsp;管理器,將發(fā)給&nbsp;servant&nbsp;的請求排隊。<BR><BR>  還需要實(shí)例化實(shí)現(xiàn):<BR><BR>清單&nbsp;6.&nbsp;SimpleCalcSvr.java&nbsp;--&nbsp;實(shí)例化實(shí)現(xiàn)&nbsp;<BR>//&nbsp;創(chuàng)建計算程序接口的&nbsp;servant<BR>SimpleCalcServant&nbsp;calcSvt&nbsp;=&nbsp;new&nbsp;SimpleCalcServant();<BR>calculator&nbsp;calc&nbsp;=&nbsp;calcSvt._this(orb);<BR>&nbsp;<BR><BR>  按照&nbsp;CORBA&nbsp;2.3&nbsp;規(guī)范,所有&nbsp;skeleton&nbsp;均提供一個&nbsp;_this()&nbsp;方法,該方法使&nbsp;servant&nbsp;能得到目標(biāo)&nbsp;CORBA&nbsp;對象的對象引用,servant&nbsp;正是用目標(biāo)&nbsp;CORBA&nbsp;對象來與這些請求相關(guān)聯(lián)的。<BR><BR>  完成實(shí)現(xiàn)的實(shí)例化以后,就必須把機(jī)制放到適當(dāng)?shù)奈恢茫员憧蛻魴C(jī)能夠找到它們。有許多不同的方法和服務(wù)可用來找到滿足接口請求的對象。CORBA&nbsp;Service&nbsp;定義&nbsp;Naming&nbsp;Service&nbsp;和&nbsp;Trader&nbsp;Services,來專門幫助客戶機(jī)查找對象,以處理請求。也可以通過方法調(diào)用來傳遞對象。<BR><BR>  在這個示例中,我們將使用所有方法中最直截了當(dāng)?shù)囊环N&nbsp;—&nbsp;將對象引用寫入一個文件,該文件將由客戶機(jī)選取。對于所有的&nbsp;ORB&nbsp;來說,創(chuàng)建一個對象引用的字符串表示,或者反過來,創(chuàng)建由字符串到對象的引用,都是必備的功能。<BR><BR>清單&nbsp;7.&nbsp;SimpleCalcSvr.java&nbsp;--&nbsp;編寫對象引用&nbsp;<BR>//&nbsp;將對象引用寫入一個文件<BR>PrintWriter&nbsp;refstr&nbsp;=&nbsp;new&nbsp;PrintWriter(<BR>new&nbsp;FileWriter("calcref.ior"));<BR>refstr.println(orb.object_to_string(calc));<BR>refstr.close();<BR><BR>&nbsp;<BR><BR>  最后要做的一件事,就是激活&nbsp;POA,使客戶機(jī)請求開始排隊,并強(qiáng)制服務(wù)器輸入其事件循環(huán),以接收這些傳入的請求。<BR><BR>清單&nbsp;8.&nbsp;SimpleCalcSvr.java&nbsp;--&nbsp;激活&nbsp;POA&nbsp;<BR>//&nbsp;使實(shí)現(xiàn)成為可用<BR>manager.activate();<BR>System.out.println("SimpleCalcSvr&nbsp;is&nbsp;running!");<BR>orb.run();<BR><BR>&nbsp;<BR><BR>  客戶機(jī)&nbsp;<BR><BR>  如果您考慮一下正在發(fā)生的事件的機(jī)制,就會明白客戶機(jī)和服務(wù)器實(shí)際上正是互為映像的。客戶機(jī)將所有的參數(shù)打包以創(chuàng)建一個請求,然后以它自己的方式來發(fā)送這個請求。服務(wù)器只是將請求中的參數(shù)解包,執(zhí)行運(yùn)算,將返回值和輸出參數(shù)打包,然后向客戶機(jī)發(fā)回響應(yīng)。客戶機(jī)則將返回值和輸出參數(shù)解包,然后繼續(xù)處理。這樣,客戶機(jī)打包什么,服務(wù)器就解包什么,反之亦然。<BR><BR>  這意味著您將會看到客戶機(jī)和服務(wù)器具有相似的結(jié)構(gòu)。客戶機(jī)還必須創(chuàng)建并初始化一個&nbsp;ORB。它可以是我們正在使用的&nbsp;ORB,也可以是另一個供應(yīng)商提供的&nbsp;ORB;但是,不能是任意的&nbsp;ORB,而應(yīng)該是支持&nbsp;IIOP&nbsp;的&nbsp;ORB,IIOP&nbsp;是由對象管理集團(tuán)&nbsp;(OMG)&nbsp;定義的、基于&nbsp;TCP/IP&nbsp;的互操作性協(xié)議。如果您的&nbsp;ORB&nbsp;比較舊,那么請小心,它可能無法與其它&nbsp;ORB&nbsp;通話。<BR><BR>  首先,我們以相同的方式創(chuàng)建&nbsp;ORB,就像創(chuàng)建服務(wù)器一樣。(您可以下載完整的&nbsp;SimpleCalcClient.java&nbsp;文件。)<BR><BR>清單&nbsp;9.&nbsp;SimpleCalcClient.java&nbsp;--&nbsp;初始化&nbsp;ORB&nbsp;<BR>java.util.Properties&nbsp;props&nbsp;=&nbsp;System.getProperties();<BR>props.put("org.omg.CORBA.ORBClass",<BR>"com.ooc.CORBA.ORG");<BR>props.put("org.omg.CORBA.ORBSingletonClass",<BR>"com.ooc.CORBA.ORBSingleton");<BR><BR>org.omg.CORBA.ORB&nbsp;orb&nbsp;=&nbsp;null;<BR>//&nbsp;初始化&nbsp;ORB<BR>orb&nbsp;=&nbsp;ORB.init(args,&nbsp;props);&nbsp;<BR>&nbsp;<BR><BR>  看起來眼熟?應(yīng)該是這樣,它看起來與服務(wù)器完全一樣。現(xiàn)在,客戶機(jī)已經(jīng)連接到了一個&nbsp;ORB&nbsp;之上,但我們的目標(biāo)是調(diào)用一個服務(wù),而這個服務(wù)是在系統(tǒng)中別的地方提供的,需要找到能響應(yīng)請求的對象。在這個示例中,這意味著要從創(chuàng)建于服務(wù)器上的文件中獲取一個對象引用。為了找到計算程序服務(wù)器,需要取得存儲在這個文件中的對象引用的字符串版本,然后把它轉(zhuǎn)換成對象引用,通過這個對象引用就可以進(jìn)行調(diào)用了。<BR><BR>  清單&nbsp;10.&nbsp;SimpleCalcClient.java&nbsp;--&nbsp;獲取對象引用&nbsp;<BR>System.out.println("Getting&nbsp;reference&nbsp;from&nbsp;string...");<BR>BufferedReader&nbsp;in&nbsp;=&nbsp;new&nbsp;BufferedReader(<BR>new&nbsp;FileReader("calcref.ior")&nbsp;);<BR>String&nbsp;ior&nbsp;=&nbsp;in.readLine();<BR>in.close();<BR><BR>calculator&nbsp;calc&nbsp;=&nbsp;calculatorHelper.narrow(<BR>orb.string_to_object(ior));<BR>&nbsp;<BR><BR>  請注意,這里使用了由&nbsp;IDL-to-Java&nbsp;編譯器生成的&nbsp;calculatorHelper&nbsp;類。calcref.ior&nbsp;文件含有一個對象引用,而不是含有計算程序引用。calculatorHelper&nbsp;類有一個&nbsp;narrow&nbsp;方法,可用來將抽象類型集中到特定的計算程序類型。<BR><BR>  仔細(xì)看一看計算程序&nbsp;calc,它表示計算機(jī)空間中另外某個地方的一個服務(wù)器。最后必須做的一件事,就是調(diào)用&nbsp;calc&nbsp;上的方法&nbsp;add()。<BR><BR>  清單&nbsp;11.&nbsp;SimpleCalcClient.java&nbsp;--&nbsp;調(diào)用&nbsp;add()<BR>System.out.println(&nbsp;calc.add(2,3)&nbsp;);<BR>&nbsp;<BR><BR>  結(jié)論&nbsp;<BR><BR>  已經(jīng)討論了很多內(nèi)容,不過請想一想,都學(xué)到了什么。我們的客戶機(jī)與服務(wù)器是完全隔離的,客戶機(jī)不知道服務(wù)器在什么樣的硬件上運(yùn)行,使用的是什么操作系統(tǒng),它是用什么語言編寫的,它是不是多線程的,還有,它位于何處&nbsp;—&nbsp;是在隔壁,還是距離半個地球之遙。它只知道一點(diǎn),即如果它調(diào)用&nbsp;calc&nbsp;中的&nbsp;add(),就會得到可以指望的響應(yīng)。<BR><BR>  提供服務(wù)的情形全都是這樣,電話或電力公司也是如此。當(dāng)您拿起電話的時候,您所期望的是聽到拔號音,然后您的呼叫能暢通連接,您并不在乎電話是通過光纜傳輸?shù)倪€是通過衛(wèi)星轉(zhuǎn)發(fā)的,同樣的情況在信息產(chǎn)業(yè)中也正在成為現(xiàn)實(shí)。多虧有了&nbsp;OMG&nbsp;和這個基本結(jié)構(gòu),我們才得以加進(jìn)這個既簡單而又非常有說服力的例子。<BR><BR>  下個月,我們將稍微深入地發(fā)掘一下,看一看發(fā)生在表面現(xiàn)象之下的&nbsp;IIOP&nbsp;的神奇力量。<BR><BR><BR>&nbsp;<BR><BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩性生活| 亚洲香肠在线观看| 国产激情偷乱视频一区二区三区| 2020国产精品久久精品美国| 国产在线精品一区二区夜色| 国产免费成人在线视频| 成人爱爱电影网址| 亚洲欧美日本韩国| 欧美肥妇bbw| 狠狠狠色丁香婷婷综合激情 | av亚洲精华国产精华精| 亚洲免费观看高清完整版在线观看熊| 91污在线观看| 日韩精品电影在线观看| 欧美精品一区二区精品网| 国产成人综合亚洲91猫咪| 亚洲女同ⅹxx女同tv| 欧美日韩不卡在线| 国产在线不卡一区| 一区二区三区高清不卡| 欧美成人vps| 91久久国产综合久久| 美国三级日本三级久久99| 国产精品毛片久久久久久| 欧美色综合久久| 国产一区二区免费看| 亚洲在线观看免费视频| 精品理论电影在线观看| 99久久久国产精品| 麻豆精品一区二区av白丝在线| 国产亚洲人成网站| 欧美嫩在线观看| 粉嫩13p一区二区三区| 偷拍与自拍一区| 国产精品的网站| 91精品国产色综合久久不卡电影| 成人短视频下载| 视频一区中文字幕| 人禽交欧美网站| 亚洲欧洲精品一区二区精品久久久| 欧美日韩一区二区三区四区五区 | 91精品国产综合久久精品性色| 国产一区二区三区最好精华液| 一区二区三区不卡在线观看| 精品国产百合女同互慰| 欧美日韩成人综合在线一区二区| 国产a精品视频| 日韩二区三区四区| 一区二区三区视频在线看| 久久亚洲精华国产精华液| 538在线一区二区精品国产| 99久久精品免费观看| 精品一区二区三区免费观看| 亚洲a一区二区| 伊人色综合久久天天人手人婷| 国产午夜精品美女毛片视频| 欧美videofree性高清杂交| 欧美日韩成人激情| 在线视频观看一区| 99国内精品久久| 国产成人精品免费在线| 久久99久久久久久久久久久| 午夜精品成人在线视频| 亚洲欧美日韩国产另类专区 | 色综合一个色综合亚洲| 成人av网站在线观看| 国产精品正在播放| 久久精品国产一区二区| 欧美96一区二区免费视频| 亚洲国产sm捆绑调教视频| 亚洲精品欧美激情| 亚洲精品国产成人久久av盗摄| 中文字幕一区二区三区视频| 国产日韩亚洲欧美综合| 久久亚洲综合色一区二区三区| 欧美哺乳videos| 久久影视一区二区| 久久久久久97三级| 久久久久国产精品厨房| 久久久国产精品午夜一区ai换脸| 久久夜色精品国产噜噜av| 久久婷婷久久一区二区三区| 2022国产精品视频| 国产日韩高清在线| 国产精品网曝门| 国产精品不卡一区| 一区二区在线观看视频| 夜夜揉揉日日人人青青一国产精品| 亚洲欧美偷拍卡通变态| 亚洲午夜在线观看视频在线| 亚洲一二三区在线观看| 午夜精品福利一区二区蜜股av | 亚洲免费三区一区二区| 一区二区三区.www| 天堂影院一区二区| 激情综合网激情| 懂色av一区二区在线播放| 在线视频综合导航| 欧美一卡二卡在线| 久久久青草青青国产亚洲免观| 中文字幕一区二区日韩精品绯色| 亚洲精品国产a| 久久国产欧美日韩精品| av不卡免费电影| 欧美日韩成人综合天天影院 | 91麻豆精品国产综合久久久久久| 91精品国产欧美一区二区成人| 精品久久久久久久久久久久久久久 | 日本亚洲欧美天堂免费| 精品午夜久久福利影院| av不卡一区二区三区| 欧美日韩国产综合一区二区三区| 日韩精品一区二区三区老鸭窝 | 午夜成人免费电影| 日本不卡123| 成人免费高清在线| 色久综合一二码| 91精品国产综合久久精品app| 欧美日韩五月天| 精品国产乱码久久| 亚洲欧美一区二区在线观看| 亚洲午夜影视影院在线观看| 精品一二线国产| www.欧美色图| 欧美二区乱c少妇| 久久久久国产精品麻豆| 伊人色综合久久天天| 看片的网站亚洲| 成人免费视频国产在线观看| 欧美性感一类影片在线播放| 欧美videossexotv100| 亚洲欧洲精品一区二区三区不卡| 视频一区视频二区中文字幕| 成人免费看片app下载| 欧美日韩另类一区| 国产偷国产偷精品高清尤物| 亚洲精品一二三区| 国产乱理伦片在线观看夜一区| 欧美色图第一页| 国产欧美视频一区二区| 亚洲一区二区三区美女| 国产suv一区二区三区88区| 欧美美女喷水视频| 亚洲欧美电影一区二区| 国产乱码精品一品二品| 欧美喷水一区二区| 亚洲欧美二区三区| 国产成人精品一区二区三区四区| 日韩一区二区在线看片| 亚洲精品中文字幕乱码三区| 国产乱一区二区| 欧美一级二级在线观看| 国产精品久久网站| 粉嫩绯色av一区二区在线观看| 91精品国产欧美一区二区成人| 亚洲日本一区二区| 国产精品自拍网站| 欧美成人国产一区二区| 亚洲mv大片欧洲mv大片精品| 95精品视频在线| 国产亚洲一区二区三区四区| 午夜久久福利影院| 欧美日韩高清影院| 亚洲视频香蕉人妖| 成人精品小蝌蚪| 国产亚洲欧美日韩日本| 亚洲第一会所有码转帖| 欧美主播一区二区三区美女| 亚洲人成影院在线观看| 不卡av在线网| 国产精品午夜春色av| 精品在线观看视频| 日韩亚洲欧美综合| 日本免费在线视频不卡一不卡二| 91搞黄在线观看| 日本一区二区三区在线观看| a亚洲天堂av| 亚洲情趣在线观看| 97se亚洲国产综合自在线| 中文字幕在线不卡视频| 在线观看国产一区二区| 亚洲一区二区三区激情| 欧美日韩一区二区在线视频| 亚洲一级片在线观看| 欧美综合一区二区三区| 亚洲国产精品久久人人爱| 91黄色免费观看| 亚洲第一电影网| 国产成人日日夜夜| 亚洲精品你懂的| 欧美日韩一区二区三区高清| 亚洲午夜免费福利视频| 欧美日韩一区二区三区在线看| 奇米一区二区三区| 26uuu久久天堂性欧美| 粉嫩一区二区三区在线看| 亚洲欧美日韩小说| 欧美电影免费观看高清完整版| 久久电影网站中文字幕 | 欧美在线不卡视频|