2016-03-02 4 views
0

я написал программу в NetBeans с RMI, что клиент имеет ошибкуClassNotFoundException с RMI

ошибка:

java.rmi.UnmarshalException: ошибка немаршалинг возврата; вложенная исключение: java.lang.ClassNotFoundException: rmiserver.Message (не менеджер безопасности: загрузчик классов RMI отключен) на sun.rmi.registry.RegistryImpl_Stub.lookup (Unknown Source)

но Север не любая ошибка!

код 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

И код не компилируется. – EJP

+0

мой код скомпилирован! BUILD SUCCESSFUL (общее время: 0 секунд). но не будет работать – sara

+0

* Этот * код не работает. У вас есть 'Message' в пакете' rmiclient' и сервер, который реализует его в пакете 'rmiserver', и нет' import rmiclient. * 'Операторов; – EJP

ответ

1

В вашем StackTrace:

java.lang.ClassNotFoundException: rmiserver.Message

, но согласно данным вы предоставили, ваш интерфейс Message является Declated с пакетом package rmiclient; и Вы не создал любой класс rmiserver.Message.

Исправьте название упаковки.

+0

thans! но в моем исходном коде для сервера и клиента и интерфейса и реализации используется «package rmiserver;» – sara

+0

@sara Итак, это не настоящий код? – EJP

+0

это оригинальный код! – sara

0

У меня есть две упаковки. rmiclient и rmiserver. что в rmiclient «сообщение» и «главное». в rmiserver «сообщения» и «основной» и «messageimpl»

Это ваша проблема. Это не удовлетворяет контракту. Вы не можете просто скопировать Message в другой пакет и рассчитывать на то, что он будет обрабатываться так же, как и оригинал. Удаленный заглушка реализует те же удаленные интерфейсы, что и удаленный объект. Не другой интерфейс с тем же именем в другом пакете.

Необходимо отправить заказчику rmiserver.Message. Как и сообщение об ошибке, действительно.

+0

, что означает, что у меня должен быть два разных интерфейса для сервера и клиентов? – sara

+0

Я не могу понять, почему или как вы можете задавать этот вопрос. Это то, что вы уже делаете. Вся суть моего ответа - это прямо противоположное. * Вы должны * делиться * тем же * интерфейсом между сервером и клиентом. То, что вы пытаетесь, бессмысленно. Я думал, что это уже ясно. – EJP

+0

спасибо большое :) моя проблема была решена. – sara