带有RMI的ClassNotFoundException

时间:2016-03-02 13:16:26

标签: java rmi classnotfoundexception

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

谢谢:)。

2 个答案:

答案 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部署到客户端。就像错误信息所说的那样,真的。