怎么?你动用了两个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文件.

解决方案 »

  1.   

    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
      

  2.   

    --客户端程序的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,给出相应的策略安全文件。