В настоящее время я работаю над заданием, связанным с 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?