1、簡介
使用RMI可以實作遠端方法的調用,是實作分布式技術的一種方法。RMI的具體應用主要來所可以歸納為三個角色:
服務提供者:實作了服務接口,為其他用戶端提供服務;
注冊伺服器:是一個提供服務注冊的實體,伺服器提供者需要把他的服務注冊到這個才可以被其他客戶查找使用;
用戶端 :服務的使用者,從注冊伺服器查找到服務,再使用服務。
關系如下圖所示
其實感覺和web Service的SOAP,WSDL,UDDI差不多。
2、建構RMI應用的步驟基本如下:
伺服器端:
• 建立遠端接口
• 實作遠端接口提供的服務(即方法)
• 啟動注冊伺服器
• 建立和注冊服務執行個體
用戶端:
• 根據注冊的服務名查找服務得到執行個體的引用
• 調用執行個體方法
下面具體看了個例子如何使用RMI建構簡單應用吧。我們來做一個加法的服務:
伺服器端:
建立接口IAdd
package myrmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IAdd extends Remote {
public int add(int a, int b) throws RemoteException;
}
實作接口AddImpl
< span style="font-size:16px;">package myrmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class AddImpl extends UnicastRemoteObject implements IAdd {
private static final long serialVersionUID = -7993126226032252610L;
public AddImpl() throws RemoteException {
}
public int add(int a, int b) throws RemoteException {
return a + b;
}
}
啟動注冊服務,注冊服務
<span style="font-size:16px;">package myrmi;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class AddService {
public static void main(String[] args) {
try {
// 在本地啟動注冊服務,或者也可以在其他機器啟動作為注冊伺服器
LocateRegistry.createRegistry(1099);
// 在其他機器啟動注冊伺服器可以用:rmiregistry port
// 建立一個遠端服務對象并注冊到注冊伺服器
IAdd addobj = new AddImpl();
// 注冊服務對象到注冊伺服器
Naming.rebind("//192.168.1.100/AddService", addobj);
System.out.println("Add Service is started!");
} catch (Exception e) {
System.out.println("Service Error!");
}
}
}
用戶端 :
package myrmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IAdd extends Remote {
public int add(int a, int b) throws RemoteException;
}
package myrmi;
import java.rmi.Naming;
public class AddClient {
public static void main(String[] argv) {
try {
// 建立遠端對象引用
IAdd objref = (IAdd) Naming.lookup("//192.168.1.100/AddService");
// 調用遠端方法
int sum = 0;
sum = objref.add(1, 1);
System.out.println("result is " + sum);
} catch (Exception e) {
e.printStackTrace();
}
}
}