Как получить доступ к переменным класса удаленного объекта - PullRequest
1 голос
/ 03 декабря 2011

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

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

То, к чему вы можете получить удаленный доступ, определяется удаленным интерфейсом по определению.То, что у вас есть на клиенте, это не сам удаленный объект, это прокси для него, который реализует тот же удаленный интерфейс.Отсюда и ваше исключение.

0 голосов
/ 18 декабря 2011

То, что уже сказано, правильно. Если вам действительно нужно имя пользователя и вы не можете изменить интерфейс. Там будет возможность отправить имя пользователя в вашем сообщении. Я не знаю, возможно ли это в вашем случае, так как я не знаю ни реализации сервера, ни реализации вашего класса сообщений. Это будет работать, если вы можете свободно манипулировать форматом вашего сообщения.

...