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