2011-09-27 101 views
0

我创建了一个简单的RMI应用程序,它只是向RMI server发送消息。但是当发送消息时,我得到了错误消息。我使用eclipse来运行程序。简单的RMI应用程序

sending hello to 10.0.0.12:3233

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: com.zoondia.ReceiveMessageInterface (no security manager: RMI class loader disabled) 
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
    at test.rmi.RmiClient.main(RmiClient.java:28) 
Caused by: java.lang.ClassNotFoundException: com.zoondia.ReceiveMessageInterface (no security manager: RMI class loader disabled) 
    at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source) 
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source) 
    at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source) 
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source) 
    at java.io.ObjectInputStream.readProxyDesc(Unknown Source) 
    at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 

任何人都知道什么是使用issue.Am日食运行,我需要RMI compailor在Eclipse中program.is,或者运行程序时自动compails。

谢谢, VKS。

回答

1

该异常表示未在服务器中安装RMI安全管理器。除非设置了安全管理员,否则RMI将无法从客户端下载任何代码。

你需要做这样的事情在你的服务器代码如下:

if (System.getSecurityManager() == null) 
{ 
    System.setSecurityManager(new java.rmi.RMISecurityManager()); 
} 

检查出RMISecurityManager的javadoc以获取更多信息。

+0

嗨布兰登,感谢您的快速回复,现在我得到了一个新的错误访问被拒绝java.net.socketpermission连接解决...从客户端....任何想法? – vks

+0

您是否在服务器端指定了安全策略(例如,使用java.security.policy命令行选项)? –

+0

不完全。看到我的答案。 – EJP

0

该异常表示指定的类不存在于客户端的类路径中。

这可能是两个原因造成的:

  1. 您没有使用codebase特征,并且尚未包括在客户端JAR文件的类。

  2. 您正在使用代码库功能,但您尚未安装安全管理器。

1

对于第一个错误,即解组参数,我有一次错误。确保在运行rmiregistry之前将目录更改为您的src文件夹

对于第二个错误,请确保已为服务器和客户端创建了策略文件。