RMI异常分析

异常一:

java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
        java.lang.ClassNotFoundException: RMITest.RemoteIMP_Stub
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396
)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
        at sun.rmi.transport.Transport$1.run(Transport.java:159)

        .......................

解决:

      在执行 start rmiregistry  命令前必须确保 RMITest.RemoteIMP_Stub.class(注意包名) 包含在了   CLASSPATH  配置的路径中

       在执行 start rmiregistry  命令前执行  set CLASSPATH=%CLASSPATH%;D:\J2EETest\testjava\src\;



异常二



1> 起初启动 rmiregistry 时报告Warning;

C:\> rmigistry

Warning: JIT compiler "symcjit" not found. Will use interpreter.

原因:

因为用Ghost还原系统后忘记了将JDK的bin路径设置到系统path环境变量中, 故找不到所需程序而发出警告.

其实在这里使用的是Oracle的 rmiregistry.exe 程序, 在以下的问题中你会发现其他与 rmiregistry.exe 相关

的错误.

解决:

将JDK的bin目录添加到 系统 path 变量中

2> 启动服务器端时报告错误:

错误一:

C:\serv> java -Djava.security.policy=file:.\RMIpolicy1.policy -Djava.rmi.server.codebase=file:.\ UpperImpl

Result errors is:

java.rmi.ServerException: Server RemoteException; nested exception is:

java.rmi.UnmarshalException: error unmarshalling arguments; nested excepti

on is:

......

原因:

Oracle9i把自己的bin路径添加到了系统path的最前端, 因而可以找到 Oracle 的 rmiregistry.exe,

而不是JDK的 rmiregistry.exe; 因而会执行错误,它和JDK的比较如下:

oracle的rmiregistry,大小为:6144字节

jdk1.4的rmiregistry,大小为:28775 字节

解决:

将所有与 Oracle 相关的 path 变量 移动到 path 变量的末尾, 将 JDK的bin路径移动到 path 变量的最前端

(警告: 未测试这样作对 Oracle 系统会带来什么样的影响)

错误二:

C:\serv> java -Djava.security.policy=file:.\RMIpolicy1.policy -Djava.rmi.server.codebase=file:.\ UpperImpl

RMIserver erroraccess denied (java.net.SocketPermission 127.0.0.1:1099 conne

esolve)

java.security.AccessControlException: access denied (java.net.SocketPermissi

27.0.0.1:1099 connect,resolve)

......

原因:

没有设置 classpath, 且文件 RMIpolicy1.policy 的内容不对

原内容为:

grant{

    permission java.security.ALLPermission;

}

这样并不使我得程序运行成功

解决:

更改 RMIpolicy1.policy 内容为:

grant {

permission java.net.SocketPermission "*:1024-65535", "accept,connect,listen,resolve"; //(1.1)

permission java.net.SocketPermission "*:80", "accept,connect,listen,resolve";  //(1.2)

permission java.security.ALLPermission;

};

或者配置你的$JRE_PATH/lib/security/java.policy

其中加入如下两行:

permission java.net.SocketPermission "*:1024-65535", "connect,accept";

permission java.net.SocketPermission "*:80", "connect";

(如果你按照第二种方法改动的话, 恐怕不会遇到下面的错误, 仅仅是猜测而已)

3> 启动客户机时有错误:

C:\client> java UpperClient

RMI exception : access denied (java.net.SocketPermission 127.0.0.1:1099 connect,

resolve)

java.security.AccessControlException: access denied (java.net.SocketPermission 1

27.0.0.1:1099 connect,resolve)

....

原因:

UpperClient.class并不是 applet , 而是 application, 又因为 RMI 有安全限制, 所以需要在客户端

使用 policy 策略文件.

解决:

将服务器目录下的 RMIpolicy1.policy 文件拷贝到 客户端目录并使用如下命令:

C:\client> java -Djava.security.policy=file:.\RMIpolicy1.policy UpperClient

[email protected]

2006-5-16

资料参考:

http://www.itpub.net/142217.html

配置你的$JRE_PATH/lib/security/java.policy

其中加入如下两行:

permission java.net.SocketPermission "*:1024-65535", "connect,accept";

permission java.net.SocketPermission "*:80", "connect";

然后你再试试看,ok?

http://202.102.240.73/java/javaweb/linuxjava/cjdk1_2-doc-zh/jdk1.2/zh/docs/guide/rmi/getstart.doc.html

注册服务程序的缺省运行端口为 1099。要在其它端口上启动注册服务程序,可利用命令行指定端口号。

例如,要在 Windows NT 系统上从端口 2001 启动注册服务程序:

start rmiregistry 2001

如果注册服务程序是在缺省端口以外的端口运行,则需要在名称中指定端口号。当调用注册服务程序时,

该名称将传给 java.rmi.Naming 类基于 URL 的方法。例如在 Hello World 示例中,如果注册服务

程序在端口 2001 上运行,则将 HelloServer 的 URL 绑定到远程对象引用所需的调用为:

Naming.rebind("//myhost:2001/HelloServer", obj);

http://ehot.blogdriver.com/ehot/455591.html

因为rmi有安全限制,所以在客户端必须建立一个策略文件

http://www.javaworld.com.tw/jute/post/print?bid=5&id=23374

你可能感兴趣的:(java,jdk,oracle,.net,Security)