提问者:小点点

带有RMI的ClassNotFoundException


我用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();
    }
}

谢谢:)。


共2个答案

匿名用户

在您的堆栈跟踪中:

java. lang.ClassNotFoundException:rsiver.Message

但根据您提供的数据,您的Message接口使用packpack rmiclient解密;并且您还没有创建任何rsever. Message类。

更正包名。

匿名用户

我有两个包。rmiclient和rtraver。在rmiclient中是“message”和“main”。在r中是“message”和“main”和“message ageimpl”

那是你的问题。这不符合合同。你不能只是将Message复制到另一个包中,并期望它被视为与原始包相同。远程存根实现了与远程对象相同的远程接口。而不是另一个包中具有相同名称的另一个接口。

您必须将rtraver. Message部署到客户端。就像错误消息所说的那样,真的。