一个最简单的RMI调用的例子,为什么出错,郁闷

ladofwind 2005-01-05 11:14:40



远程接口:
package test;
import java.rmi.*;

public interface HelloIn extends java.rmi.Remote{
String sayHello() throws RemoteException;
}
远程对象:
package test;

import java.rmi.*;
//import java.net.*;
import java.rmi.registry.*;
import java.rmi.server.*;

public class Hello extends java.rmi.server.UnicastRemoteObject implements HelloIn{
public Hello() throws RemoteException{
super();
}
public String sayHello() throws RemoteException{
return "Hello,World!";
}
public static void main(String[] args){
System.setSecurityManager(new java.rmi.RMISecurityManager());
try{

Hello h=new Hello();
java.rmi.Naming.bind("Hello",h);
System.out.print("Ready......");
}
catch(Exception e){
e.printStackTrace();
}

}
}
之后生成skeleton,stub都很正常

调用的程序:
package test;

import java.rmi.*;
import java.rmi.registry.*;

public class Helloworld{
public static void main(String[] args){
System.setSecurityManager(new java.rmi.RMISecurityManager());
try{
HelloIn hi=(HelloIn)Naming.lookup("hello");
for(int i=0;i<10;i++){
System.out.println(hi.sayHello());
}
}
catch(Exception e){
e.printStackTrace();
}
}
}



编译成功后,我在控制台 start rmiregistry 后,
启动服务程序,java test.Hello,出错,下面是
错误输出,大家帮忙看看,有没有遇到过的?


java.security.AccessControlException: access denied (java.net.SocketPermission 1
27.0.0.1:1099 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlConte
xt.java:269)
at java.security.AccessController.checkPermission(AccessController.java:
401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:524)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1026)
at java.net.Socket.connect(Socket.java:446)
at java.net.Socket.connect(Socket.java:402)
at java.net.Socket.<init>(Socket.java:309)
at java.net.Socket.<init>(Socket.java:124)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirect
SocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMaster
SocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:562)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185
)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:313)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at java.rmi.Naming.bind(Naming.java:111)
at test.Hello.main(Hello.java:20)
...全文
219 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ladofwind 2005-01-11
  • 打赏
  • 举报
回复
搞定了,谢谢,
debug148 2005-01-10
  • 打赏
  • 举报
回复
mark
ladofwind 2005-01-07
  • 打赏
  • 举报
回复
???:(
jingjing1128 2005-01-05
  • 打赏
  • 举报
回复
up
GJA106 2005-01-05
  • 打赏
  • 举报
回复
楼上答案已经能解决了。
是权限问题。jdk1.3版本以下的,对权限卡得比较死。

jdk1.4以上版本不需要再这样作了。。。
tomcatjava 2005-01-05
  • 打赏
  • 举报
回复
设置访问权限client.policy:
grant
{
permission java.net.SocketPermission "*:1024-65535","connect";
};

然后在客户端程序中,将java.security.policy属性设置为它的文件名,从而指令安全管理器读取该策略文件。
在HelloWorld.java客户端程序,main函数中,第一行加上:
System.setProperty( "java.security.policy", "client.policy" );
ladofwind 2005-01-05
  • 打赏
  • 举报
回复
北极猩猩 2005-01-05
  • 打赏
  • 举报
回复
是访问权限的问题,建议仔细去看看《Java编程思想》这部分的内容,说得比较详细
tomcatjava 2005-01-05
  • 打赏
  • 举报
回复
楼主:自己不清楚,还在这里一个劲的晕菜。大家帮你又不一定肯定给你解决,在这里发什么牢骚?凭什么发牢骚?

谁让你的服务器端也设置安全管理器了,把第一行:
System.setSecurityManager(new java.rmi.RMISecurityManager());去掉。
jgo 2005-01-05
  • 打赏
  • 举报
回复
是java.policy文件吧
ladofwind 2005-01-05
  • 打赏
  • 举报
回复
Exception in thread "main" java.lang.ExceptionInInitializerError: java.util.Miss
ingResourceException: Can't find bundle for base name test.rmi.config, locale zh
_CN
at java.util.ResourceBundle.throwMissingResourceException(Unknown Source
)
at java.util.ResourceBundle.getBundleImpl(Unknown Source)
at java.util.ResourceBundle.getBundle(Unknown Source)
at test.Configur.<clinit>(Configur.java:18)
at test.Hello.main(Hello.java:49)


改了改又出现这个,郁闷到崩溃
ladofwind 2005-01-05
  • 打赏
  • 举报
回复
照你说的在D:\j2sdk1.4.2_03\jre\lib\security下建了 client.policy, 然后还是那个错误!
ladofwind 2005-01-05
  • 打赏
  • 举报
回复
晕,关键是我得先启动服务程序啊,这个Hello都出错了啊 ?
tomcatjava 2005-01-05
  • 打赏
  • 举报
回复
client.policy需要自己建立,象我那样创建一个就行了。
ladofwind 2005-01-05
  • 打赏
  • 举报
回复
而且我是执行服务端程序就出的错误,在客户端程序改了也没用啊?
ladofwind 2005-01-05
  • 打赏
  • 举报
回复
可是我是1.4.2版本啊,晕,而且也没找到 client.policy
wadsunglow 2005-01-05
  • 打赏
  • 举报
回复
已经解决了呀,帮顶

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧