現在、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