RMI,遠程方法調用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java應用程序的方便途徑。RMI是非常容易使用的,但是它非常的強大。
RMI的基礎是接口,RMI構架基于一個重要的原理:定義接口和定義接口的具體實現是分開的。下面我們通過具體的例子,建立一個簡單的遠程計算服務和使用它的客戶程序
一個正常工作的RMI系統由下面幾個部分組成:
- 遠程服務的接口定義
- 遠程服務接口的具體實現
- 樁(Stub)和框架(Skeleton)文件
- 一個運行遠程服務的服務器
- 一個RMI命名服務,它允許客戶端去發現這個遠程服務
- 類文件的提供者(一個HTTP或者FTP服務器)
- 一個需要這個遠程服務的客戶端程序
相關代碼如下:
接口類
public interface RMI_Add extends java.rmi.Remote {
?public long add(long a, long b, long c) throws java.rmi.RemoteException;
}
實現類
import java.rmi.Naming;
public class RMI_AddImpl extends java.rmi.server.UnicastRemoteObject implements RMI_Add {
?public RMI_AddImpl() throws java.rmi.RemoteException {
??super();
?}
?public long add(long a, long b, long c) throws java.rmi.RemoteException {
??return a + b + c;
?}
?public static void main(String[] args) {
??try {
???RMI_Add d = new RMI_AddImpl();
???Naming.rebind("rmi://127.0.0.1:1099/RMI_AddService", d);
??} catch (Exception e) {
???e.printStackTrace();
??}
?}
}
客戶端
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
public class Client {
?public static void main(String[] args) {
??System.setSecurityManager(new RMISecurityManager());
??try {
???RMI_Add t = (RMI_Add) Naming.lookup("rmi://127.0.0.1:1099/RMI_AddService");
???for (int i = 0; i < 10; i++)
????System.out.println("Perfect time =" + t.add(1, 2, 3));
??} catch (MalformedURLException e) {
???e.printStackTrace();
??} catch (RemoteException e) {
???e.printStackTrace();
??} catch (NotBoundException e) {
???e.printStackTrace();
??}
?}
}
一條最簡單的安全策略,它允許任何人做任何事,對于你的更加關鍵性的應用,你必須指定更加詳細安全策略。
grant {
? permission java.security.AllPermission "", "";
};
相關命令
rmic -classpath . -d . RMI_AddImpl
start rmiregistry 1099
java -Djava.rmi.server.codebase=file:///E:/workspace/rmi/ RMI_AddImpl
java -Djava.security.policy=policy.txt Client