一:工作原理
RMI系統(tǒng)結(jié)構(gòu),在客戶(hù)端和服務(wù)器端都有幾層結(jié)構(gòu)。
--------- ---------
| 客戶(hù)對(duì)象| | 遠(yuǎn)程對(duì)象|
--------- ---------
| | | |
------------------------------ ---------------------------------
| 占位程序 Stub | | 骨干網(wǎng) Skeleton |
------------------------------- ------- ------------------------
| | | |
-----------------------------------------------------------------
| 遠(yuǎn) 程 引 用 層 Remote Reference Layer |
------------------------------------ ----------------------------
| |
------------------------------------
| 傳 輸 層 Transport Layer |
------------------------------------
方法調(diào)用從客戶(hù)對(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ì)象。
占位程序扮演著遠(yuǎn)程服務(wù)器對(duì)象的代理的角色,使該對(duì)象可被客戶(hù)激活。
遠(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ù)器端的傳輸層傳遞回客戶(hù)端,再向上
經(jīng)傳輸層和遠(yuǎn)程調(diào)用層返回。最后,占位程序獲得返回值。
(以上為引用他人原話(huà))
二:rmi相關(guān)類(lèi)
rmi由5個(gè)包和3個(gè)應(yīng)用工具組成:
java.rmi 組織客戶(hù)端的rmi類(lèi),接口和異常
java.rmi.sever 組織服務(wù)器端的rmi類(lèi),接口和異常
java.rmi.registry 組織用于管理rmi命名服務(wù)的類(lèi)
java.rmi.dgc 組織用于管理分布式垃圾收集的類(lèi)
java.rmi.activation 組織用于實(shí)現(xiàn)按需緝獲的rmi服務(wù)的類(lèi)
rmic 編譯器,生成stub和sketon
rmiregistry 一個(gè)為rmi提供命名服務(wù)的服務(wù)器,這項(xiàng)服務(wù)把名字和對(duì)象關(guān)聯(lián)在一起
rmid 一個(gè)支持rmi激活框架的服務(wù)器
但是大多數(shù)情況下,我們只需要使用每個(gè)包的一部分方法和接口就可以成功的實(shí)現(xiàn)一個(gè)使用rmi分布式解決方案.
三:步驟
要完成以上步驟需要有以下幾個(gè)步驟:
1、生成一個(gè)遠(yuǎn)程接口
2、實(shí)現(xiàn)遠(yuǎn)程對(duì)象(服務(wù)器端程序)
3、生成占位程序和骨干網(wǎng)(服務(wù)器端程序)
4、編寫(xiě)服務(wù)器程序
5、編寫(xiě)客戶(hù)程序
6、注冊(cè)遠(yuǎn)程對(duì)象
7、啟動(dòng)遠(yuǎn)程對(duì)象
四:一個(gè)簡(jiǎn)單應(yīng)用
一共有三個(gè)java類(lèi),遠(yuǎn)程接口,服務(wù)端程序,客戶(hù)端程序
遠(yuǎn)程接口:
import java.rmi.*;
public interface HelloIn extends java.rmi.Remote{
String sayHello() throws RemoteException;
}
服務(wù)端程序:
import java.rmi.*;
import java.net.*;
import java.rmi.registry.*;
import java.rmi.server.*;
public class Hello extends java.rmi.server.UnicastRemoteObject implements HelloIn{
public Hello() throws RemoteException{
super();
}
public String sayHello() throws RemoteException{
return "Hello,World!";
}
public static void main(String[] args){
//System.setSecurityManager(new java.rmi.RMISecurityManager());
try{
Hello h=new Hello();
java.rmi.Naming.rebind("hello",h);
System.out.print("Ready......");
}
catch(Exception e){
e.printStackTrace();
}
}
}
rmic Hello 生成Stub 和 Skeleton
start rmiregistry 執(zhí)行服務(wù)端程序前在命令行方式下啟動(dòng)rmi的注冊(cè)程序
java Hello 啟動(dòng)服務(wù)器
客戶(hù)端程序:
import java.rmi.*;
import java.rmi.registry.*;
public class Helloworld{
public static void main(String[] args){
//System.setProperty( "java.security.policy", "client.policy" );
//System.setSecurityManager(new java.rmi.RMISecurityManager());
try{
HelloIn hi=(HelloIn)Naming.lookup("http://127.0.0.1/hello");
for(int i=0;i<10;i++){
System.out.println(hi.sayHello());
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
編譯:javac Helloworld.java
最后執(zhí)行java Helloworld 控制臺(tái)打印出 Hello,World,成功調(diào)用.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=263163