我在Netbeans中编写了一个程序,其中RMI表明客户端有错误
错误:
java.rmi.UnmarshalException:错误解组返回;嵌套 异常是:java.lang.ClassNotFoundException:rmiserver.Message (没有安全管理器:禁用RMI类加载器)at sun.rmi.registry.RegistryImpl_Stub.lookup(未知来源)
但是服务器没有任何错误!
interfaace代码:
package rmiclient;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Message extends Remote {
void sayHello(String name) throws RemoteException;
}
接口实现是:
package rmiserver;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MessageImpl extends UnicastRemoteObject implements Message {
public MessageImpl() throws RemoteException {
}
@Override
public void sayHello(String name) throws RemoteException {
System.out.println("hello "+name);
}
}
服务器代码是:
package rmiserver;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Main {
private void startServer(){
try {
// create on port 1099
Registry registry = LocateRegistry.createRegistry(1099);
// create a new service named myMessage
registry.rebind("myMessage", new MessageImpl());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("system is ready");
}
public static void main(String[] args) {
Main main = new Main();
main.startServer();
}
}
客户端代码是:
package rmiclient;
import java.rmi.RMISecurityManager;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Main {
private void doTest(){
try {
// fire to localhost port 1099
Registry myRegistry = LocateRegistry.getRegistry("127.0.0.1", 1099);
// search for myMessage service
Message impl = (Message) myRegistry.lookup("myMessage");
// call server's method
impl.sayHello("edwin");
System.out.println("Message Sent");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Main main = new Main();
main.doTest();
}
}
谢谢:)。
答案 0 :(得分:1)
在你的stacktrace中:
java.lang.ClassNotFoundException:rmiserver.Message
但根据您提供的数据,您的Message
界面已使用包package rmiclient;
进行了解除,并且您尚未创建任何rmiserver.Message
类。
更正包名称。
答案 1 :(得分:0)
我有两个包。 rmiclient和rmiserver。在rmiclient中的是" message"和"主要" 。在rmiserver中有" message"和"主要"和" messageimpl"
这是你的问题。这不符合合同。您不能将Message
复制到另一个包中,并希望将其视为与原始包相同。远程存根实现与远程对象相同的远程接口。不是另一个包中具有相同名称的其他接口。
您必须将rmiserver.Message
部署到客户端。就像错误信息所说的那样,真的。