明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

對于遠(yuǎn)程方法調(diào)用(RMI)的完成

[摘要]遠(yuǎn)程方法調(diào)用 遠(yuǎn)程方法調(diào)用(Remote Method Invocation ,RMI)使用戶能訪問在另一 主機上的Java對象,并遠(yuǎn)程調(diào)用其方法。程序的對象是客戶,而遠(yuǎn)程對象是服 務(wù)器。遠(yuǎn)程對象也...

遠(yuǎn)程方法調(diào)用

遠(yuǎn)程方法調(diào)用(Remote Method Invocation ,RMI)使用戶能訪問在另一
主機上的Java對象,并遠(yuǎn)程調(diào)用其方法。程序的對象是客戶,而遠(yuǎn)程對象是服
務(wù)器。遠(yuǎn)程對象也可以是另一個遠(yuǎn)程服務(wù)對象的客戶。通過使用持續(xù)性(串行
化和解串行化),本地對象和原始類型值可以作為參數(shù)傳遞給遠(yuǎn)程對象。這種
方式允許Java程序可以利用分布式計算將工作量分散到多個Java虛擬機上。

工作原理
RMI系統(tǒng)結(jié)構(gòu),在客戶端和服務(wù)器端都有幾層結(jié)構(gòu)。
--------- ----------
客戶 服務(wù)器
---------- ----------

------------- ----------
占位程序 骨干網(wǎng)
-------------- -----------

------------------------------------
遠(yuǎn) 程 引 用 層
------------------------------------

------------------------------------
傳 輸 層
------------------------------------

方法調(diào)用從客戶對象經(jīng)占位程序(Stub)、遠(yuǎn)程引用層(Remote Reference
Layer)和傳輸層(Transport Layer)向下,傳遞給主機,然后再次經(jīng)傳
輸層,向上穿過遠(yuǎn)程調(diào)用層和骨干網(wǎng)(Skeleton),到達(dá)服務(wù)器對象。
占位程序扮演著遠(yuǎn)程服務(wù)器對象的代理的角色,使該對象可被客戶激活。
遠(yuǎn)程引用層處理語義、管理單一或多重對象的通信,決定調(diào)用是應(yīng)發(fā)往一個
服務(wù)器還是多個。傳輸層管理實際的連接,并且追追蹤可以接受方法調(diào)用的
遠(yuǎn)程對象。服務(wù)器端的骨干網(wǎng)完成對服務(wù)器對象實際的方法調(diào)用,并獲取返
回值。返回值向下經(jīng)遠(yuǎn)程引用層、服務(wù)器端的傳輸層傳遞回客戶端,再向上
經(jīng)傳輸層和遠(yuǎn)程調(diào)用層返回。最后,占位程序獲得返回值。

要完成以上步驟需要有以下幾個步驟:
1、生成一個遠(yuǎn)程接口
2、實現(xiàn)遠(yuǎn)程對象(服務(wù)器端程序)
3、生成占位程序和骨干網(wǎng)(服務(wù)器端程序)
4、編寫服務(wù)器程序
5、編寫客戶程序
6、注冊遠(yuǎn)程對象
7、啟動遠(yuǎn)程對象

具體實現(xiàn)如下:
1、生成一個遠(yuǎn)程接口
package c15.ptime;
import java.rmi.*;

public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}

2、實現(xiàn)遠(yuǎn)程對象(服務(wù)器端程序)
package c15.ptime;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;

public class PerfectTime
extends UnicastRemoteObject
implements PerfectTimeI {
public long getPerfectTime()
throws RemoteException {
return System.currentTimeMillis();
}

public PerfectTime() throws RemoteException {
super();
}

public static void main(String[] args) {
System.setSecurityManager(
new RMISecurityManager());
try {
PerfectTime pt = new PerfectTime();
Naming.rebind(
"http://zhouty:2005/PerfectTime" , pt);
System.out.println("Ready to do time");
} catch(Exception e) {
e.printStackTrace();
}
}
}

4、編譯遠(yuǎn)程對象(服務(wù)器端程序)
javac -classpath . -d . PerfectTime.java

5、生成根和干(占位程序和骨干程序)
rmic -classpath . -d . c15.ptime.PerfectTime

6、注冊遠(yuǎn)程對象
start rmiregistry 2005

7、啟動服務(wù)器端程序
java -Djava.rmi.server.codebase=file:///d:/TestRMI/ c15.ptime.Per
fectTime

8、編寫客戶端程序
package c15.ptime;
import java.rmi.*;
import java.rmi.registry.*;

public class DisplayPerfectTime {
public static void main(String[] args) {
System.setSecurityManager(
new RMISecurityManager());
try {
PerfectTimeI t =
(PerfectTimeI)Naming.lookup(
"192.168.0.171:2005/PerfectTime");
for(int i = 0 ; i < 10; i++)
System.out.println("Perfect time =" +
t.getPerfectTime());
} catch(Exception e) {
e.printStackTrace();
}
}
}

9、編譯客端程序
javac -classpath . -d . DisplayPerfectTime.java

10、修改JVM的配置文件 (客戶機和服務(wù)器的都需要經(jīng)過修改)
%JRE_HOME%\policytool.exe

11、啟動客戶程序
java -classpath . c15.ptime.DisplayPerfectTime

12、返回結(jié)果

Perfect time =967274884390
Perfect time =967274884450
Perfect time =967274884450
Perfect time =967274884450
Perfect time =967274884500
Perfect time =967274884500
Perfect time =967274884560
Perfect time =967274884610
Perfect time =967274884610
Perfect time =967274884610


<------------ 完 ------------->
參考:
《JAVA 編程思想》
《輕松掌握J(rèn)BUILDER2》
《SUN JDK文檔》


--
我思,故我在