2016-03-02 106 views
0

我在NetBeans寫了一個程序與RMI客戶端有錯誤ClassNotFoundException的使用RMI

錯誤:

java.rmi.UnmarshalException:錯誤和解組返回;嵌套0​​例外是:拋出java.lang.ClassNotFoundException:rmiserver.Message (無安全管理器:RMI類裝載器禁用)在 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

而代碼不能編譯。 – EJP

+0

我的代碼編譯完成!建立成功(總時間:0秒)。但不會運行 – sara

+0

*這*代碼沒有。你在'rmiclient'包中有'Message'和在'rmiserver'包中實現它的服務器,並且沒有'import rmiclient。*'語句; – EJP

回答

1

在您的堆棧跟蹤:

拋出java.lang.ClassNotFoundException:rmiserver.Message

但每個數據你提供,你Message接口declated與包package rmiclient;和你有沒有創建任何rmiserver.Message類。

更正軟件包名稱。

+0

thans!但在我的原始代碼爲服務器和客戶端和接口和實現使用「包rmiserver;」 – sara

+0

@sara所以這不是真正的代碼? – EJP

+0

現在是原始代碼! – sara

0

我有兩個包。 rmiclient和rmiserver。在消費者中是「消息」和「主」。在rmiserver中是「message」和「main」和「messageimpl」

這就是你的問題。這不符合合同。您不能將Message複製到另一個軟件包,並希望將其與原始文件一樣對待。遠程存根實現與遠程對象相同的遠程接口。不是另一個包中具有相同名稱的另一個接口。

您必須將rmiserver.Message部署到客戶端。就像錯誤信息所說的那樣,真的。

+0

這意味着我必須有兩個不同的服務器和客戶端接口? – sara

+0

我不明白你爲什麼或者怎麼可能會問這個問題。這就是你已經在做的事情。我的答案的重點完全相反。*您必須*共享*服務器和客戶端之間的*相同*接口。你試圖做的是沒有意義的。我以爲我已經明確表示了。 – EJP

+0

非常感謝:)我的問題解決了。 – sara

相關問題