我用RMI在netbean中编写了一个程序,客户端有错误
错误:
java. rmi.UnmarshalException:错误解组返回;嵌套异常是:java.lang.ClassNotFoundException:rsiver.Message(无安全管理器:禁用RMI类加载器)在sun.rmi.注册。RegistryImpl_Stub.lookup(未知来源)
但sever没有任何错误!
中间电码:
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();
}
}
谢谢:)。
在您的堆栈跟踪中:
java. lang.ClassNotFoundException:rsiver.Message
但根据您提供的数据,您的Message
接口使用packpack rmiclient解密;
并且您还没有创建任何rsever. Message
类。
更正包名。
我有两个包。rmiclient和rtraver。在rmiclient中是“message”和“main”。在r中是“message”和“main”和“message ageimpl”
那是你的问题。这不符合合同。你不能只是将Message
复制到另一个包中,并期望它被视为与原始包相同。远程存根实现了与远程对象相同的远程接口。而不是另一个包中具有相同名称的另一个接口。
您必须将rtraver. Message
部署到客户端。就像错误消息所说的那样,真的。