我目前正致力于处理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的用户名吗?
答案 0 :(得分:1)
根据定义,您可远程访问的内容由远程接口定义。您在客户端拥有的不是远程对象本身,它是实现相同远程接口的代理。因此你的例外。
答案 1 :(得分:0)
已经说过的是正确的。 如果您确实需要用户名而无法更改界面。可以在您的消息中发送用户名。我不知道你的情况是否可行,因为我不知道服务器实现和消息类的实现。 如果您可以自由地操纵您的消息格式,这将有效。