JavaRMI-10-6-北大計算機系java培訓講義_第1頁
JavaRMI-10-6-北大計算機系java培訓講義_第2頁
JavaRMI-10-6-北大計算機系java培訓講義_第3頁
JavaRMI-10-6-北大計算機系java培訓講義_第4頁
JavaRMI-10-6-北大計算機系java培訓講義_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、9.6 一個RMI的分布式應用的實例用RMI編寫一個分布式應用,核心有以下三方面:定位遠程對象1. 一個應用可以利用RMI的名字服務功能注冊器遠程對象。2. 可以象操作普通對象一樣傳送并返回一個遠程對象的引用(指針)。與遠程對象通信:底層的通信由RMI實現(xiàn),對于系統(tǒng)開發(fā)人員來說,遠程調(diào)用和標準的Java方法調(diào)用沒有什么區(qū)別。為需要傳遞的對象裝載類的字節(jié)碼RMI允許調(diào)用者向遠程對象傳遞一個對象,因此 RMI提供這種裝載對象的機制。1本資源由 寒秀草與巧克力 搜集與網(wǎng)絡請您在傳播的時候?qū)⑾螺d分數(shù)設為0真正體現(xiàn)資源共享的理念謝謝更多0分資料去我的文庫29.6 一個RMI的分布式應用的實例Web Se

2、rverClient ServerWeb ServerregistryURL protocolRMIRMIURL protocolURL protocolRMI39.6 一個RMI的分布式應用的實例Compute enginServerRemote objectClienttaskClienttaskClienttask 一、問題的提出49.6 一個RMI的分布式應用的實例分布特點:engin開發(fā),先運行,task后定義.寫engin時不對執(zhí)行什么任務作任何規(guī)定.任務可以是任意定制的.前提條件:定義任務的類,要規(guī)定任務的實現(xiàn)步驟,使得這個任務能夠提交給engin去執(zhí)行.使用server上的 C

3、PU資源. 技術(shù)支持:RMI的動態(tài)裝載功能.59.6 一個RMI的分布式應用的實例遠程對象clientserverAm1遠程方法A.m1()遠程對象必須繼承遠程接口確定那些方法是遠程方法,為此定義遠程接口遠程接口只負責提供方法名,不一共實現(xiàn)細節(jié),因此必須由一個對象來實現(xiàn)接口executeTaskcomputeengineComputeexecuteTask69.6 一個RMI的分布式應用的實例二、設計一個服務器核心協(xié)議:提交任務,執(zhí)行任務,返回結(jié)果clientclient在java中遠程調(diào)用是通過定義遠程接口來實現(xiàn)的, 一個接口只能有一個方法不同類型的任務,只要他們實現(xiàn)了Task類型,就可以在

4、engin上運行.實現(xiàn)這個接口的類,可以包含任何任務計算需要的數(shù)據(jù)以及和任何任務計算需要的方法.79.6 一個RMI的分布式應用的實例(1)定義遠程接口第一個接口:computepackage compute;import java.rmi.Remote;import java.rmi.RemoteException;public interface Compute extends Remote Object executeTask(Task t) throws RemoteException;package compute;import java.io.Serializable;public

5、 interface Task extends Serializable Object execute(); 第二個接口:定義一個task類型,作為參數(shù)傳給executeTask方法,規(guī)定了engin與它的任務之間的接口,以及如何啟動它的任務.它 不是一個遠程接口executeTaskcomputeengineComputeexecuteTask89.6 一個RMI的分布式應用的實例Compute engin的設計要考慮以下問題:1. compute engine是一個類 ComputeEngine ,它實現(xiàn)了 Compute接口,只要調(diào)用該類的方法executeTask, 任務就能提交上來.

6、2. 提交任務的Client 端程序并不知道任務是被下載到engin上執(zhí)行的.因此client在定義任務時并不需要包含如何安裝的server端的代碼.3. 返回類型是對象,如果結(jié)果是基本類型,需要轉(zhuǎn)化成相應的對等類.4. 用規(guī)定任務如何執(zhí)行的代碼填寫execute方法. 99.6 一個RMI的分布式應用的實例(2)實現(xiàn)遠程接口一般說來,實現(xiàn)一個遠程接口的類至少有以下步驟:1. 聲明遠程接口2. 為遠程對象定義構(gòu)造函數(shù)3. 實現(xiàn)遠程方法engin中創(chuàng)建對象的工作可以在實現(xiàn)遠程接口類的main函數(shù)中實現(xiàn):1. 創(chuàng)建并安裝安全管理器2. 創(chuàng)建一個或更多的遠程對象的實例3. 至少注冊一個遠程對象109

7、.6 一個RMI的分布式應用的實例package engine;import java.rmi.*; import java.rmi.server.*; import compute.*;public class ComputeEngine extends UnicastRemoteObject implements Compute public ComputeEngine() throws RemoteException super(); public Object executeTask(Task t) return t.execute(); public static void main

8、(String args) if (System.getSecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); String name = /host/Compute; try Compute engine = new ComputeEngine(); Naming.rebind(name, engine); System.out.println(ComputeEngine bound); catch (Exception e) System.err.println(ComputeEngine

9、exception: + e.getMessage(); e.printStackTrace(); 119.6 一個RMI的分布式應用的實例在構(gòu)造函數(shù)中,通過super(), a UnicastRemoteObject 被啟動,即它可以偵聽客戶端來的請求輸入只有一個遠程方法,參數(shù)是客戶端遠程調(diào)用這個方法時傳來的任務.這個任務被下載到engin,遠程方法的內(nèi)容就是調(diào)用客戶端任務的方法,并把結(jié)果回送給調(diào)用者.實際上這個結(jié)果是在客戶的任務的方法中體現(xiàn)的.executeTaskcomputeengineComputeexecuteTaskcallexecuteTask(task)129.6 一個RMI

10、的分布式應用的實例參數(shù)傳遞規(guī)則:1. 遠程對象通常通過引用傳遞.一個遠程對象的引用是一個stub,它是客戶端的代理.它實現(xiàn)遠程對象中的遠程接口的內(nèi)容2. 本地對象通過串行化拷貝到目的. 如果不作制定,對象的所有成員都將被拷貝. 139.6 一個RMI的分布式應用的實例通過引用傳遞一個對象,意味著任何由于遠程調(diào)用引起的變化都能反映在原始的對象中。當傳遞一個遠程對象時,只有遠程接口是可用的, 而在實現(xiàn)類中定義的方法或者是非遠程接口中的方法,對接收者來說是不可用的在遠程方法調(diào)用中,參數(shù),返回值,異常等非對象是值傳送. 這意味著對象的拷貝被傳送到接受方。任何在對象上發(fā)生的變化不影響原始的對象一旦服務器

11、用rmi注冊了,main方法就存在了,不需要一個守護線程工作維護服務器的工作狀態(tài),只要有一個computer engin的引用在另一個虛擬機,computer engin就不會關(guān)閉149.6 一個RMI的分布式應用的實例三、實現(xiàn)一個客戶程序目標:創(chuàng)建一個任務,并規(guī)定如何執(zhí)行這個任務。clientPicomputePipackage compute;public interface Task extends java.io.Serializable Object execute();task不是遠程接口,但是需要傳遞到服務器,因此用串行化ExecuteTask()execute()159.6 一

12、個RMI的分布式應用的實例computePi的作用裝載安全管理器生成一個遠程對象 comp生成任務對象Look up(ComputeEngin),獲得了stubsPi task=new Pi()調(diào)用ComputeEngin的遠程方法獲得計算結(jié)果Comp.executeTask(task)169.6 一個RMI的分布式應用的實例package client;import java.rmi.*; import java.math.*; import compute.*;public class ComputePi public static void main(String args) if (S

13、ystem.getSecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); try String name = / + args0 + /Compute; Compute comp = (Compute) Naming.lookup(name); Pi task = new Pi(Integer.parseInt(args1); BigDecimal pi = (BigDecimal) (comp.executeTask(task); System.out.println(pi); catch (

14、Exception e) System.err.println(ComputePi exception: + e.getMessage(); e.printStackTrace(); 179.6 一個RMI的分布式應用的實例Pi的作用computepirmiregistryCompute engin實現(xiàn)Task接口實現(xiàn)execute算法189.6 一個RMI的分布式應用的實例package client; import compute.*; import java.math.*;public class Pi implements Task private static final BigDe

15、cimal ZERO = BigDecimal.valueOf(0); private static final BigDecimal ONE = BigDecimal.valueOf(1); private static final BigDecimal FOUR = BigDecimal.valueOf(4); private static final int roundingMode = BigDecimal.ROUND_HALF_EVEN; public Pi(int digits) this.digits = digits; 199.6 一個RMI的分布式應用的實例public Ob

16、ject execute() return computePi(digits); * pi/4 = 4*arctan(1/5) - arctan(1/239)*public static BigDecimal computePi(int digits) int scale = digits + 5; BigDecimal arctan1_5 = arctan(5, scale); BigDecimal arctan1_239 = arctan(239, scale); BigDecimal piarctan1_5.multiply(FOUR).subtract(arctan1_239).mul

17、tiply(FOUR); return pi.setScale(digits, BigDecimal.ROUND_HALF_UP); 209.6 一個RMI的分布式應用的實例 /* * Compute the value, in radians, of the arctangent of * the inverse of the supplied integer to the speficied * number of digits after the decimal point. The value * is computed using the power series expansion

18、 for the * arctangent: * arctan(x) = x - (x3)/3 + (x5)/5 - (x7)/7 + * (x9)/9 . */ 219.6 一個RMI的分布式應用的實例public static BigDecimal arctan(int inverseX, int scale) BigDecimal result, numer, term; BigDecimal invX = BigDecimal.valueOf(inverseX); BigDecimal invX2 = BigDecimal.valueOf(inverseX * inverseX); n

19、umer = ONE.divide(invX, scale, roundingMode); result = numer; int i = 1; do numer =numer.divide(invX2, scale, roundingMode); int denom = 2 * i + 1; term = numer.divide(BigDecimal.valueOf(denom), scale, roundingMode); if (i % 2) != 0) result = result.subtract(term); else result = result.add(term); i+

20、; while (pareTo(ZERO) != 0); return result; 229.6 一個RMI的分布式應用的實例由于Rmi的存在,系統(tǒng)可以做到:1、可以直接通過名字定位遠程方法的位置2、以參數(shù)的形式將一個對象傳遞給一個遠程方法3、可以使一個對象到另外一個虛擬機上運行4、計算結(jié)果可以返回239.6 一個RMI的分布式應用的實例將接口,遠程對象,客戶代碼分成三個程序包:1. compute ( Compute and Task interfaces) 2. engine ( ComputeEngine implementation class and its stub) 3. cl

21、ient ( ComputePi client code and Pi task implementation) 249.6 一個RMI的分布式應用的實例接口compute對于編程雙方都是需要的,通常將接口文件打成包,分發(fā)給server和client的開發(fā)者: 假設接口的開發(fā)者將寫好的接口程序放在c:homewaldosrccompute目錄下cd c:homewaldosrcjavac computeCompute.javajavac computeTask.javajar cvf compute.jar compute*.class259.6 一個RMI的分布式應用的實例類文件必須是網(wǎng)絡可

22、訪問的,rmi利用URL定位類文件假設 ComputeEngine.java 存放在 c:homeannsrcengine 假設 compute.jar存放在 c:homeannpublic_htmlclasses. 設置環(huán)境變量CLASSPATH=c:homeannsrc;c:homeannpublic_htmlclassescompute.jar269.6 一個RMI的分布式應用的實例編譯 ComputeEngine.java,產(chǎn)生一個 stub,并使stub是網(wǎng)絡可訪問的. 產(chǎn)生stub的命令是rmic,生成的文件形式為: className_Stubs.class和className_

23、skeleton.class命令如下:cd c:homeannsrcjavac engineComputeEngine.javarmic -d . engine.ComputeEnginemd c:homeannpublic_htmlclassesenginecopy engineComputeEngine_*.class c:homeannpublic_htmlclassesengine279.6 一個RMI的分布式應用的實例展開接口文件cd c:homeannpublic_htmlclassesjar xvf compute.jar289.6 一個RMI的分布式應用的實例執(zhí)行程序1. 在啟

24、動compute engine之前, 首先要啟動RMI的 registry。unset CLASSPATHstart rmiregistry2. 啟動Server.確認compute.jar文件和實現(xiàn)遠程對象的類在指定的class路徑下set CLASSPATH=c:homeannsrc;c:homeannpublic_htmlclassescompute.jar299.6 一個RMI的分布式應用的實例啟動 compute engine時,要規(guī)定服務器端的類在什么情況下是可用的。啟動Compute enginejava -Djava.rmi.server.codebase= :homeannp

25、ublic_htmlclasses/ -Djava.rmi.server.hostname= -Djava.security.policy=java.policy engine.ComputeEngine 309.6 一個RMI的分布式應用的實例3. 啟動 Client指定類(pi)的位置 set CLASSPATH=c:homejonessrc;c:homejonespublic_htmlclassescompute.jar-java -Djava.rmi.server.codebase= :homejonespublic_htmlclasses/ -Djava.security.polic

26、y=java.policyclient.ComputePi localhost 20輸入完上述命令后,得到結(jié)果 3.149323846319.6 一個RMI的分布式應用的實例329.7 基于CORBA的分布式應用系統(tǒng)的實例windowsNT(C+)Sun(Java)Netscape(COBOL)client339.7 基于CORBA的分布式應用系統(tǒng)的實例CORBA技術(shù)和Java技術(shù)的結(jié)合-Java IDL什么是IDL?IDL是CORBA規(guī)范中的接口定義語言,不依賴于任何具體的編程語言.CORBA提供了到各種不同語言的IDL映射.Java IDL是CORBA到Java的映射,使Java也支持CO

27、RBA規(guī)范Java IDL和Java RMI非常相似,RMI只支持Java語言寫的分布對象,Java IDL可以和CORBA支持的任何一種語言編寫的ORB對象進行交互Java RMI和Java IDL目前使用的通信協(xié)議不同,分別是JRMP和IIOP.349.7 基于CORBA的分布式應用系統(tǒng)的實例在Java IDL中,客戶端通過引用與遠程的對象進行交互,即客戶機使用stubs對遠程服務器上的對象進行操作,但并不拷貝服務器上的對象.Java RMI即可以通過引用,也可以將對象下載到本地機上運行(因為有串行化功能).Java實現(xiàn)簡單,但語言不兼容Java IDL則可以充分發(fā)揮語言無關(guān)的優(yōu)勢359.

28、7 基于CORBA的分布式應用系統(tǒng)的實例IDL Java的技術(shù)組成:IDL至Java的編譯器:idltojava生成客戶端的stubs和服務器端的skeletonCORBA API 和 ORB一個簡單的名字服務369.7 基于CORBA的分布式應用系統(tǒng)的實例IDL接口IDL編譯器(C+, Java)服務程序IDL Stub客戶應用對象實現(xiàn)SkeletonC+, Java編譯器C+, Java編譯器客戶程序應用開發(fā)者379.7 基于CORBA的分布式應用系統(tǒng)的實例ORB內(nèi)核BOAIDL SkeletonIDL文件IDL編譯器對象實現(xiàn)應用開發(fā)者事件感知部分事件適配部分 事件處理分發(fā)部分 事件處理部

29、分從反應式Agent的角度看389.7 基于CORBA的分布式應用系統(tǒng)的實例CORBA編程實例運行在瀏覽器中的客戶對象與遠程的服務對象交互,客戶端的表現(xiàn)是在瀏覽器中點擊一個button,就會在一個文本域中返回服務端的時間,同時也在服務端的標準輸出上打印該時間。buttonThe data in server side is2000.6.112:56:00server時間是一個對象399.7 基于CORBA的分布式應用系統(tǒng)的實例ORBCLIENTSTUBSSKELETONSSERVERORBIIOPMETHOD REQUESTOBJECT REFERENCESERVANT409.7 基于CORB

30、A的分布式應用系統(tǒng)的實例1. 首先是定義交互接口,在文件dateit.idl中。module TheDate (相當于包) interface DateIt string dateit(); ;2. 用IDL接口到Java語言的映射jidl dateit.idl 該命令會生成幾個相關(guān)的java文件:DateIt.javaDateItHelper.javaDateItHolder.java _DateItImplBase.javaStubForDateIt.java419.7 基于CORBA的分布式應用系統(tǒng)的實例3. 編寫服務對象的程序,在文件DateIt_impl.java中package T

31、heDate; / jidl 產(chǎn)生的Java文件放在TheDate包中import org.omg.CORBA.*; import java.io.*;import java.awt.*;import java.util.Date;import java.lang.System;public class DateIt_impl extends _DateItImplBase /擴展了 jidl 生成的抽象類_DateItImplBase String date_time; public String dateit() date_time=(new Date().toString(); /獲取時

32、間 System.out.println(date_time); return date_time;/ 向客戶端返回時間串 429.7 基于CORBA的分布式應用系統(tǒng)的實例4. 編寫服務方的程序,在文件Server.java中。package TheDate; import org.omg.CORBA.*;import java.io.*;public class Server public static void main(String args) try / 創(chuàng)建ORB和BOA對象實例 ORB orb = ORB.init(args, new java.util.Properties();

33、 / 生成服務對象實例 BOA boa = orb.BOA_init(args); DateIt_impl p = new DateIt_impl(); /創(chuàng)建服務對象實例439.7 基于CORBA的分布式應用系統(tǒng)的實例/ 保存引用try String ref = orb.object_to_string(p); /將對象編碼成字符串 String refFile = date.ref; file = new (refFile); PrintStream out = new PrintStream(file); out.println(ref); /存入文件date.ref中 out.flus

34、h(); (); catch(IOException ex) System.err.println(Cant write to +ex.getMessage(); System.exit(1); 449.7 基于CORBA的分布式應用系統(tǒng)的實例/將引用存入html文件中,參見后面列出的date.html 文try String ref = orb.object_to_string(p); String refFile = c:InetpubDocsdate.html; file = new (refFile); PrintStream out = new PrintStream(file);

35、out.println(); 459.7 基于CORBA的分布式應用系統(tǒng)的實例/指由Client.java編譯成的class文件out.println(); /將由服務對象轉(zhuǎn)化成的字符串存入超文本文件中out.println();out.println();name=org.omg.CORBA.ORBSingletonClass + value out.println();out.flush(); (); /這樣瀏覽器調(diào)入該超文本頁面時,會運行Client.class的applet,并將包含標識服務對象的字符串由參數(shù)ior傳遞給applet。 catch(IOException ex) System.err.println(“Cant write to ”+ex.getMessage()+“”); System.exit(1); 469.7 基于CORBA的分布式應用系統(tǒng)的實例/ 服務對象就緒,準備接受請boa.impl_is_ready(null); System.exit(0); catch(S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論