2010-06-07 90 views
1

當我嘗試運行RMI服務器我得到下面的異常後運行的RMI客戶端:RMI在客戶端生成的異常讓到RMI服務器時的參考

EncodeInterface exception: java.lang.ClassCastException: $Proxy30 cannot be cast to hw2.chat.backend.main.EncodeInterface 
java.lang.ClassCastException: $Proxy30 cannot be cast to hw2.chat.backend.main.EncodeInterface 
at hw2.chat.backend.main.EncodingRmiClient.initialiseRMIClient(EncodingRmiClient.java:26) 

而且在RMI相關的代碼客戶端:

EncodeInterface encodeInterface; 
Registry registry = LocateRegistry.getRegistry(host, portNumber); 
encodeInterface = (EncodeInterface)registry.lookup("RmiEncodingServer"); //line 26 

而在RMI服務器:

try 
    { 
     EncodeInterface encodeInterface = new EncoderImpl(); 
     Registry registry = LocateRegistry.getRegistry(); 
     registry.rebind("RmiEncodingServer", encodeInterface); 
     System.out.println("RmiEncodingServer is running..."); 
    } 

EncodeInterface是擴展Remote的接口,也存在於客戶端。

主機是「127.0.0.1」,portNumber是1099(我假設它應該是默認值1099,因爲我沒有在運行我的RmiEncodingServer時指定它)。

如果我不運行RMI服務器,我會得到相同的異常,對於這種情況發生的原因有什麼想法?

感謝

回答

0

問題是,我不得不對服務器和客戶端不同的包名,但分配給客戶端的類必須是完全一樣的服務器..

2

一個ClassCastException通常意味着要麼

  • EncoderImpl沒有實現EncodeInterface,或
  • 在客戶端和服務器端的.jar不同,導致兩個版本的被部署的類別,這被認爲是不同的。

一些提示:

  1. 檢查是否實現接口,例如

    EncoderImpl extends UnicastRemoteObject implements EncodeInterface

  2. 添加的版本標識到您的類被Java serialization,例如爲支持

    static final long serialVersionUID = 10275539472837495L;

  3. 清潔,重建和重新部署,並重新啓動一切,以確保相同的罐子被everywere部署並沒有什麼地方運行已經

希望它可以幫助服務器,否則在問題中提供更多信息。

相關問題:Java RMI proxy issue