RMI的几个问题总结, 共勉

最近由于项目的需要,研究了一下RMI的相关应用,学习JAVA最大的好处就是大牛们为我们做了好多底层的工作,我们只是直接拿过来用就好了,但是这之间也碰到了不少的问题,所以对于学习JAVA的人来说,必要的了解一些底层的东西还是很有必要的,不然以后只能停留在技工的这个阶段上了。

开发一直用的是Ubuntu系统,很喜欢这个系统,部分原因是因为它的特效做的很炫,当然更大的原因是对开源社区的尊敬和喜爱,因为真的能学到很多的东西。不过用Ubuntu的时候,发现用sudo apt-get install sun-java5-jdk之后,不用设置JAVA、CLASSPATH等环境变量也可以真接进行编译和运行程序,具体的原因不明白,只是觉得神奇,所以下面的第2个问题,在网上找了好多的资料,当然只是看了之篇文章才解决的,所以觉得这位仁兄的文章很有收藏价值,特此转载一下,现在之些是我的废话,下面的是转封不动的转载,感谢!!!!!

这几天小弟在学习RMI, 也碰到了一些头疼的问题!!!
万事开头难嘛, 好歹现在已经运行起来了, 写写总结, 留作以后学习!!

书目:<Java网络高级编程> 作者 殷兆麟, 张永平, 姜淑娟,
源码:第2章 Java RMI 技术 中的 例子
(书中的说明实在简单, 还有几处错误)

先说明一下系统环境:
操作系统: windows 2003 server
安装与java相关的有 JDK. 和 Oracle9i,
因为装有Ghost, 所以常常还原.

最终的文件目录如下:
C:.
│  tree.txt
│ 
├─client
│      UpperClient.class
│      UpperImpl_Stub.class
│      Upper.class
│      RMIpolicy1.policy
│     
└─serv
        Upper.java
        UpperImpl.java
        UpperClient.java
        Upper.class
        UpperImpl.class
        UpperImpl_Stub.class
        RMIpolicy1.policy


遇到的问题有:

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


btpka3@163.com
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

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/goleagle/archive/2009/04/25/4107853.aspx

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值