我目前正在處理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的用戶名嗎?
如果您需要訪問遠程對象的方法,它確實需要在界面中。如果您試圖通過投射來破解它,那麼您將忽略使用接口的全部理由。 –
我們的作業規範說,用命令行中的用戶名來調用聊天客戶端的每個實例,這就是爲什麼我認爲我必須能夠以某種方式訪問它。 – Andy