关于 Java Tutorial中rmi样例的一个问题

黄鹤 甜新科技 CTO/CIO/技术副总裁/总工程师  2003-04-21 04:12:15

按照tutorial中的样例做来,最后还差一点,就是 ComputeEngine_Stub 不能从服务器端自动下载。(如果手动拷贝到客户端,一切OK)查了一下我的环境和代码,百思不得其解。

服务器端:
java -Djava.rmi.server.codebase=http://172.16.4.95:8001/ -Djava.rmi.server.hostname=172.16.4.95 -Djava.security.policy=java.policy engine.ComputeEngine

客户端:
java -Djava.rmi.server.codebase=http://172.16.4.95:8002/ -Djava.sec
urity.policy=java.policy client.ComputePi 172.16.4.95 20

http://172.16.4.95:8001/下有 compute、engine两个目录和所有class文件,以及compute.jar

http://172.16.4.95:8002/下有 client目录和所有class文件,以及compute.jar

...全文
12 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jxspace 2003-04-28
--客户端程序的codebase如果换成是 8001 端口的,会报告 client.Pi class not found.

由于你下载的文件是jar文件,因而,在启动客户端的时候(如果没有将jar解开),那么应该用java -classpath %classpath%;xx.jar ...来启动,这样就可以避免客户端的类没有找到这种问题。

--codebase
codebase的确是供远程下载类来用的,如服务器端启动,需要查验远程对象的stub是否可以从本地类路径或者是codebase指定的路径找到.而对于客户端启动,也是如此,先看本地是否存在远程对象的stub,如果没有,也同样到codebase指定地方下载到本地。

--为什么必须要设置codebase
正如前面所说,codebase是给下载类来使用的。需要澄清的是,rmi的server与client可以在同一个机器上运行,也可以在不同机器上运行。本地运行仅仅是属于开发测试级别,因而,不必单独启动rmiregistry,也不必加载rmisecuritymanager,也不需要策略安全文件,sun提供的很多代码例子可以不必指定上面所说的条件就运行,也就是基于本地模式(本地进程间访问)。值得指出的是,在启动虚拟机的时候,必须让服务器端或者客户端都能找到stub类,无论你的类是jar或者unjar的形式。
远程访问应给出codebase,给出相应的策略安全文件。
回复
黄鹤 2003-04-28
codebase 换成file:///...的方式做了一次,在java.policy中添加了:
permission java.io.FilePermission "c:\\rmiserver\\classes\\-", "read";
permission java.io.FilePermission "c:\\rmiclient\\classes\\-", "read";
然后在运行java程序时换成file:///c:/rmiserver/classes/ ......
成功。

然后再换回去,还是成功,没法再复现错误了,也许当时我漏掉了什么环境?

to jxspace(彼黍离离)
客户端程序的codebase如果换成是 8001 端口的,会报告 client.Pi class not found.

纠正了原来一个错误的认识:
设定codebase是干什么用的?原来以为是远程系统用的,用来获取相应的类文件;现在明白,是本地的java程序所使用的。

还存在一个疑问:
为什么必须要设置codebase?或者,在什么样的情况下可以不设置?
在我的实验里,服务器端服务不设置codebase,就会找不到engine.ComputeEngine_Stub这个类,而这个类在classpath中是可以找到的。同样在客户端,不设codebase的话会找不到client.Pi
回复
Mai_520 2003-04-22
我也想知道..up一个
回复
jxspace 2003-04-21
怎么?你动用了两个webserver么?呵呵,照我的理解,client端要下载的stub应该在服务器启动的时候指定的codebase,也就是说

客户端应该是:
java -Djava.rmi.server.codebase=http://172.16.4.95:8001/ -Djava.sec
urity.policy=java.policy client.ComputePi 172.16.4.95 20

另外,最好在codebase中指定jar文件.
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2003-04-21 04:12
社区公告
暂无公告