如何访问远程对象的类变量

时间:2011-12-03 01:24:13

标签: java client-server rmi

我目前正致力于处理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);

            ...
    }
}

当我尝试使用deliver方法时,就像现在一样,我得到的错误是:

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

我知道deliver()中的演员阵容导致了问题,但我不确定这样做的正确方法是什么。还有另一种方法可以获得ChatClient的用户名吗?

2 个答案:

答案 0 :(得分:1)

根据定义,您可远程访问的内容由远程接口定义。您在客户端拥有的不是远程对象本身,它是实现相同远程接口的代理。因此你的例外。

答案 1 :(得分:0)

已经说过的是正确的。 如果您确实需要用户名而无法更改界面。可以在您的消息中发送用户名。我不知道你的情况是否可行,因为我不知道服务器实现和消息类的实现。 如果您可以自由地操纵您的消息格式,这将有效。