2011-12-03 51 views
1

我目前正在處理RMI的任務。從本質上講,它只是一個聊天室。那我遇到的問題,不過,是我希望能夠從我的客戶得到一個用戶名變量,但變量不是它的遠程接口的一部分:如何訪問遠程對象的類變量

public interface MulticastClient extends Remote { 

    public void deliver(MulticastClient sender, String channel, 
     Serializable message) throws RemoteException; 
} 

據我瞭解,因爲sender實際上是一個遠程對象,我只能訪問界面中定義的方法和變量。由於這是一項家庭作業,我無法更改界面(它已交給我們)。

從我MulticastClient執行一些代碼:

public class ChatClient implements MulticastClient { 

     ... 
     private String username; 

    @Override 
    public void deliver(MulticastClient sender, String channel, 
     Serializable message) throws RemoteException { 

    String senderName = ((ChatClient)sender).getUsername(); 
    System.out.println("\r" + senderName + ": " + message.toString()); 
    } 

    public String getUsername() { 
     return username; 
    } 

    ... 

    public static void main(String[] args) throws Exception{ 
      ... 

    ChatClient client = new ChatClient(); 
    MulticastClient stub = (MulticastClient)UnicastRemoteObject.exportObject(client, 0); 

    Registry reg = LocateRegistry.getRegistry(hostname, port); 
    MulticastService server = (MulticastService)reg.lookup(SERVER_NAME); 

      ... 
    } 
} 

當我嘗試用戶的交付方法,因爲它是現在,我得到的錯誤是:

Exception in thread "Thread-2" java.lang.ClassCastException: $Proxy0 cannot 
be cast to csci4401.mc.ChatClient 

我知道演員在deliver()是造成這個問題,但我不知道什麼是正確的方法來做到這一點。有另一種方法可以獲得ChatClient的用戶名嗎?

+0

如果您需要訪問遠程對象的方法,它確實需要在界面中。如果您試圖通過投射來破解它,那麼您將忽略使用接口的全部理由。 –

+0

我們的作業規範說,用命令行中的用戶名來調用聊天客戶端的每個實例,這就是爲什麼我認爲我必須能夠以某種方式訪問​​它。 – Andy

回答

1

您可以遠程訪問的內容由遠程接口定義。你在客戶端擁有的不是遠程對象本身,它是實現相同遠程接口的代理。因此你的例外。

0

已經說了什麼是正確的。 如果您確實需要用戶名並且無法更改界面。將有可能在您的消息中發送用戶名。我不知道你的情況是否可能,因爲我不知道服務器實現和消息類的實現。 如果您可以自由操作您的消息格式,這將工作。