RMI(遠端接口調用)
1. RMI的原理:
RMI系統結構,在用戶端和伺服器端都有幾層結構。
方法調用從客戶對象經占位程式(Stub)、遠端引用層(Remote Reference Layer)和傳輸層(Transport
Layer)向下,傳遞給主機,然後再次經傳 輸層,向上穿過遠端調用層和骨幹網(Skeleton),到達伺服器對象。
占位程式扮演着遠端伺服器對象的代理的角色,使該對象可被客戶激活。
遠端引用層處理語義、管理單一或多重對象的通信,決定調用是應發往一個伺服器還是多個。傳輸層管理實際的連接配接,并且追追蹤可以接受方法調用的遠端對象。服
務器端的骨幹網完成對伺服器對象實際的方法調用,并擷取傳回值。傳回值向下經遠端引用層、伺服器端的傳輸層傳遞回用戶端,再向上經傳輸層和遠端調用層返
回。最後,占位程式獲得傳回值。
2. RMI(遠端方法調用)的組成
一個正常工作的RMI系統由下面幾個部分組成:
•遠端服務的接口定義
•遠端服務接口的具體實作
•樁(Stub)和架構(Skeleton)檔案
•一個運作遠端服務的伺服器
•一個RMI命名服務,它允許用戶端去發現這個遠端服務
•類檔案的提供者(一個HTTP或者FTP伺服器)
•一個需要這個遠端服務的用戶端程式
3. RMI的實作
3.1 伺服器端的實作
(1)編寫一個遠端接口:
package com.gjy.rmi.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface AddServer extends Remote {
public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException;
}
(2) 編寫遠端接口的實作
package com.gjy.rmi.service;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class AddServerImpl extends UnicastRemoteObject implements AddServer {
public AddServerImpl() throws RemoteException {
super();
}
public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException {
return firstnumber + secondnumber;
}
}
package com.gjy.rmi.service;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class RmiServer {
/**
* 啟動 RMI 注冊服務并進行對象注冊
*/
public static void main(String[] argv)
{
try
{
//啟動RMI注冊服務,指定端口為1099 (1099為預設端口)
//也可以通過指令 $java_home/bin/rmiregistry 1099啟動
//這裡用這種方式避免了再打開一個DOS視窗
//而且用指令rmiregistry啟動注冊服務還必須事先用RMIC生成一個占位程式(stub類)為它所用
LocateRegistry.createRegistry(1099);
//建立遠端對象的一個或多個執行個體,下面是hello對象
//可以用不同名字注冊不同的執行個體
AddServer add = new AddServerImpl();
//把hello注冊到RMI注冊伺服器上,命名為Hello
Naming.rebind("Hello", add);
//如果要把hello執行個體注冊到另一台啟動了RMI注冊服務的機器上
//Naming.rebind("//192.168.1.105:1099/Hello",hello);
System.out.println("Hello Server is ready.");
}
catch (Exception e)
{
System.out.println("Hello Server failed: " + e);
}
}
}
package com.gjy.rmi.client;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import com.gjy.rmi.service.AddServer;
public class RmiClient {
public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException {
String url="rmi://127.0.0.1/Hello";
AddServer add;
add = (AddServer)Naming.lookup(url);
int result=0;
for (int i =0;i<10;i++){
result = add.AddNumbers(10,i);
System.out.println(result);
}
}
}
懷有希望!!