RMI實(shí)例參考模板_第1頁(yè)
RMI實(shí)例參考模板_第2頁(yè)
RMI實(shí)例參考模板_第3頁(yè)
RMI實(shí)例參考模板_第4頁(yè)
RMI實(shí)例參考模板_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、2009-10-22RMI實(shí)例1 / 9Remote Method Invocation (RMI - Java遠(yuǎn)程方法調(diào)用)允許您使用Java編寫(xiě)分布式對(duì)象。本文將介紹RMI的優(yōu)點(diǎn)以及如何將其連接到現(xiàn)有的和原有的系統(tǒng)中,以及與用Java 編寫(xiě)的組件的連接,同時(shí)給出了一個(gè)詳細(xì)的例子,可以給初學(xué)者提供一個(gè)學(xué)習(xí)范本。 一、RMI(遠(yuǎn)程方法調(diào)用)的組成 一個(gè)正常工作的RMI系統(tǒng)由下面幾個(gè)部分組成: 1、遠(yuǎn)程服務(wù)的接口定義 2、遠(yuǎn)程服務(wù)接口的具體實(shí)現(xiàn) 3、樁(Stub)和框架(Skeleton)文件 4、一個(gè)運(yùn)行遠(yuǎn)程服務(wù)的服務(wù)器 5、一個(gè)RMI命名服務(wù),它允許客戶端去發(fā)現(xiàn)這個(gè)遠(yuǎn)程服務(wù) 6、類(lèi)文件的提供

2、者(一個(gè)HTTP或者FTP服務(wù)器) 7、一個(gè)需要這個(gè)遠(yuǎn)程服務(wù)的客戶端程序 二、RMI(遠(yuǎn)程方法調(diào)用)的工作原理 RMI系統(tǒng)結(jié)構(gòu),在客戶端和服務(wù)器端都有幾層結(jié)構(gòu)。 - - | 客戶 | | 服務(wù)器| - - | | - - | 占位程序 | | 骨干網(wǎng) | - - | | - | 遠(yuǎn) 程 引 用 層 | - | | - | 傳 輸 層 | - 方法調(diào)用從客戶對(duì)象經(jīng)占位程序(Stub)、遠(yuǎn)程引用層(Remote Reference Layer)和傳輸層(Transport Layer)向下,傳遞給主機(jī),然后再次經(jīng)傳 輸層,向上穿過(guò)遠(yuǎn)程調(diào)用層和骨干網(wǎng)(Skeleton),到達(dá)服務(wù)器對(duì)象。 占位程序扮

3、演著遠(yuǎn)程服務(wù)器對(duì)象的代理的角色,使該對(duì)象可被客戶激活。 遠(yuǎn)程引用層處理語(yǔ)義、管理單一或多重對(duì)象的通信,決定調(diào)用是應(yīng)發(fā)往一個(gè)服務(wù)器還是多個(gè)。傳輸層管理實(shí)際的連接,并且追追蹤可以接受方法調(diào)用的遠(yuǎn)程對(duì)象。服務(wù)器端的骨干網(wǎng)完成對(duì)服務(wù)器對(duì)象實(shí)際的方法調(diào)用,并獲取返回值。返回值向下經(jīng)遠(yuǎn)程引用層、服務(wù)器端的傳輸層傳遞回客戶端,再向上經(jīng)傳輸層和遠(yuǎn)程調(diào)用層返回。最后,占位程序獲得返回值。 要完成以上步驟需要有以下幾個(gè)步驟: 1、生成一個(gè)遠(yuǎn)程接口 2、實(shí)現(xiàn)遠(yuǎn)程對(duì)象(服務(wù)器端程序) 3、編寫(xiě)服務(wù)器程序 、注冊(cè)遠(yuǎn)程對(duì)象、啟動(dòng)遠(yuǎn)程對(duì)象 4、編寫(xiě)客戶程序   在JDK1.5之后,用java提供的API將會(huì)更加的

4、簡(jiǎn)單,可以參照下面的例子; 三、例子 1、遠(yuǎn)程接口 /* * 該接口定義了一個(gè)方法,用于提供遠(yuǎn)程服務(wù); */ package com.liuxiang.rmi.download; import java.rmi.Remote; import java.rmi.RemoteException; /* * 遠(yuǎn)程對(duì)象接口 */ public interface IRMI extends Remote     public Object invoke(ITask task) throws RemoteException; 2、實(shí)現(xiàn)遠(yuǎn)程對(duì)象(服務(wù)器端程序) /* * 實(shí)現(xiàn)了

5、遠(yuǎn)程接口定義的方法;該實(shí)現(xiàn)遠(yuǎn)程對(duì)象中,調(diào)用了傳入?yún)?shù)的task.doWork()方 * 法,同時(shí)執(zhí)行一個(gè)本地調(diào)用,調(diào)用一個(gè)播放Mp3的代碼段ProcessCaller.callMp3(); */ package com.liuxiang.rmi.download; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import com.liuxiang.callwindow.ProcessCaller; /* * 遠(yuǎn)程對(duì)象的實(shí)現(xiàn) */ public class IRMIImpl extend

6、s UnicastRemoteObject implements IRMI     protected IRMIImpl() throws RemoteException         super();         private static final long serialVersionUID = 6131922116577454476L; public Object invoke(ITask task) throws Re

7、moteException         System.out.println("注意:這是一個(gè)遠(yuǎn)程調(diào)用");         Object obj = task.doWork();         System.out.println("調(diào)用ITask.doWork()方法的返回值:"+obj.toString();   &

8、#160;     /客戶端調(diào)用,可以在服務(wù)器端播放需要的音樂(lè)         ProcessCaller.callMp3();         return obj;     3、播放Mp3代碼段的源代碼如下: package com.liuxiang.callwindow; /* * 在java中調(diào)用windows程序 */ public class ProcessCaller &#

9、160;   /*      * 調(diào)用Windows程序      * 利用Windows Media Player播放mp3音樂(lè)      */     public static void callMp3()         Runtime ru = Runtime.getRuntime();      

10、   try             / 調(diào)用播放器文件播放指定MP3             Process p1 = ru.exec("C:Program FilesWindows Media Playerwmplayer F:/music/lx/劉若英-后來(lái).mp3");      

11、   catch (Exception e)                 public static void main(String args)         callMp3();     4、任務(wù)接口 /* * 該接口定義了遠(yuǎn)程方法需要傳遞的參數(shù) */ package com.liuxiang.rmi.download; import j

12、ava.io.Serializable; /* * 任務(wù)接口 * */ public interface ITask extends Serializable     public Object doWork(); 5、任務(wù)接口實(shí)現(xiàn) package com.liuxiang.rmi.download; /* * 任務(wù)實(shí)現(xiàn)類(lèi) * 該實(shí)現(xiàn)定義了遠(yuǎn)程方法需要傳遞的參數(shù) * */ public class TaskImpl implements ITask     public Object doWork()   

13、0;     System.out.println("當(dāng)前程序處于遠(yuǎn)程調(diào)用中");         return "動(dòng)態(tài)上載對(duì)象的返回值"         6、編寫(xiě)服務(wù)器程序 、注冊(cè)遠(yuǎn)程對(duì)象、啟動(dòng)遠(yuǎn)程對(duì)象 /* *遠(yuǎn)程對(duì)象的注冊(cè)類(lèi).該類(lèi)應(yīng)該在服務(wù)器端執(zhí)行 *執(zhí)行之后,該機(jī)器將變?yōu)镽MI服務(wù)器,客戶端可以通過(guò)正確的url來(lái)訪問(wèn); *服務(wù)器上的遠(yuǎn)程對(duì)象;執(zhí)行對(duì)外報(bào)露的方法 */ packag

14、e com.liuxiang.rmi.download; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class RMIServer     /*      * 如果沒(méi)有創(chuàng)建一個(gè)Registry,Naming是不會(huì)幫助你創(chuàng)建的。 還是自己手工創(chuàng)建的比較的好      *     

15、 * 盡量用下面的自己封裝的bind方法來(lái)注冊(cè)遠(yuǎn)程對(duì)象      *      * throws Exception      */     public static void registRemoteObject() throws Exception         IRMIImpl impl = new IRMIImpl();    

16、0;    Naming.rebind("rmi:/7:1111/mytask", impl);         System.out.println("bound success!");         /*      * 創(chuàng)建一個(gè)Registry對(duì)象      *   &#

17、160;  * return 返回一個(gè)Registry對(duì)象      */     private static Registry createRegistry()         Registry registry = null;         int port = 1111;         try &

18、#160;           registry = LocateRegistry.getRegistry(port);             registry.list();             System.out.println("Register the

19、exist server!");         catch (final Exception e)             try                 registry = LocateRegistry.createRegistry(port);

20、                 System.out.println("Register the exist server!port=" + port);             catch (final Exception ee)        

21、         ee.printStackTrace();                             return registry;         /*    

22、  * 將對(duì)象注冊(cè)到rmi服務(wù)器上      */     public static void bind()         Registry registry = null;         registry = createRegistry();         try   

23、0;         IRMIImpl impl = new IRMIImpl();             registry.rebind("mytask", impl);             System.out.println("mytask server s

24、tart!");         catch (Exception e)             e.printStackTrace();                 /*      * param args   &

25、#160;  */     public static void main(String args)         try             bind();         catch (Exception e)        &#

26、160;    e.printStackTrace();             /運(yùn)行該服務(wù)端代碼后,將會(huì)注冊(cè)一個(gè)遠(yuǎn)程服務(wù)對(duì)象,通過(guò)恰當(dāng)?shù)腢RL可以訪問(wèn)遠(yuǎn)程對(duì)象 /中的方法;運(yùn)行后的結(jié)果如下: /Register the exist server!port=1111 /mytask server start! 7、編寫(xiě)客戶程序 /* * 代碼首先獲取一個(gè)遠(yuǎn)程對(duì)象,然后如同本地調(diào)用一樣,調(diào)用遠(yuǎn)程對(duì)象中的方法。 */ package com.liuxiang.rmi.

27、download; import java.rmi.Naming; public class RMIClient     /*      * 調(diào)用遠(yuǎn)程對(duì)象中的方法      * throws Exception      */     public static void getRemoteObject() throws Exception         IRMI obj = (IRMI)Naming.lookup("rmi:/localhost:1111/mytask");    /得到遠(yuǎn)程發(fā)布的服務(wù)         TaskImpl task = new TaskImpl();  &#

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論