




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 財(cái)務(wù)信息保密及第三方審計(jì)協(xié)議
- 智能辦公系統(tǒng)與辦公室裝修一體化項(xiàng)目合同
- 收養(yǎng)協(xié)議書(shū)范本范文
- 賣(mài)公司協(xié)議書(shū)范本
- 研發(fā)中心場(chǎng)地租賃保證金技術(shù)轉(zhuǎn)移轉(zhuǎn)化協(xié)議
- 創(chuàng)業(yè)公司財(cái)務(wù)總監(jiān)股權(quán)分配及風(fēng)險(xiǎn)控制聘用合同
- 河道渣土清運(yùn)協(xié)議書(shū)范本
- 美國(guó)出口貨物貨運(yùn)代理合同范本
- 機(jī)場(chǎng)擴(kuò)建征地拆遷補(bǔ)償協(xié)議書(shū)
- 企業(yè)并購(gòu)重組稅務(wù)處理與咨詢(xún)服務(wù)合同
- 汽車(chē)行業(yè)焊接車(chē)間工位縮寫(xiě)
- DB61-T 5068-2023 鋼橋面改性聚氨酯混凝土鋪裝應(yīng)用技術(shù)規(guī)程
- 基于水凝膠模板原位合成磷酸鈣類(lèi)骨組織修復(fù)材料及表征
- 畜牧獸醫(yī)畢業(yè)論文名字
- 中國(guó)聯(lián)通5G毫米波技術(shù)白皮書(shū)
- 醫(yī)療人文關(guān)懷
- 系統(tǒng)規(guī)劃與管理師-輔助記憶口訣
- 預(yù)防接種異常反應(yīng)監(jiān)測(cè)與處理
- 輸液發(fā)熱反應(yīng)的護(hù)理流程圖
- 2023-2024學(xué)年四川省阿壩州小學(xué)語(yǔ)文四年級(jí)期末深度自測(cè)試卷詳細(xì)參考答案解析
- 8D報(bào)告樣板(設(shè)備故障的8D報(bào)告)
評(píng)論
0/150
提交評(píng)論