网上大多数RMI的例子、教程,关于部署讲得较少,并且很多是有错的,所以在这里总结一下。
以下假设服务器端与客户端的主目录下面都具有策略文件:.java.policy,其内容假设是:
grant {
// Allow everything
permission java.security.AllPermission;
};
当RMI服务器端跟客户端需要部署到不同的机器时:
1. 服务器注册时应该使用
Naming.rebind("//10.1.16.207/Server", instance);
2. 服务器启动时应是:
java -Djava.rmi.server.codebase=http://10.1.16.207/download/ ServerImpl
同时把ServerImpl_Stub放在http://10.1.16.207/download/下供下载
3. rmiregistry启动时,需要注意rmiregistry进程所具有的CLASSPATH变量,最简单的方法是,单独开一个console把CLASSPATH清空再运行rmiregistry
4. 客户端程序也需要设置SecurityManager,这在网上许多例子中都没有实现
经过上面4步,就应该能实现真正的远程调用了。
(java -Djava.rmi.server.codebase=http://10.1.16.207/download/ Client)
当RMI服务跟客户端服务在同一台机,并且不需要下载Stub类时:
把stub,skeleton放在服务器类所在目录。
1. 服务器注册时应该使用
Naming.rebind("Server", instance);
2. 服务器启动时只需:
java ServerImpl
3. rmiregistry启动时,需要注意rmiregistry进程所具有的CLASSPATH变量,此时应该让rmiregistry能找到Stub类。最简单的方法是,在CLASSPATH的值为.的时候,在stub类目录下运行start rmiregistry。
4. 注意CLASSPATH,让客户端类能找到stub类,运行客户端程序:java Client即可。