2011-12-03 14 views
1

現在、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のユーザー名を取得できる別の方法はありますか?

+0

リモートオブジェクトのメソッドにアクセスする必要がある場合は、実際にはそのインターフェイスに存在する必要があります。あなたがキャスティングでそれをハックしようとすると、インターフェイスを使用する理由のすべてを無視しています。 –

+0

私たちの宿題の仕様では、コマンドラインからユーザー名を使ってチャットクライアントの各インスタンスを呼び出すと言われています。だからこそ、何とかそれにアクセスできるようにしなければならないと思いました。 – Andy

答えて

1

リモートでアクセスできるものは、リモートインタフェースによって定義されています。クライアントで持っているのはリモートオブジェクトではなく、同じリモートインタフェースを実装するプロキシです。したがってあなたの例外。

0

既に言われていることは正しいです。 本当にユーザー名が必要な場合は、インターフェースを変更できません。メッセージにユーザー名を送信する可能性があります。私はあなたのケースで可能かどうかはわかりません。サーバー実装やメッセージクラスの実装についてはわかりません。 あなたのメッセージのフォーマットを自由に操作できるなら、これはうまくいくでしょう。

関連する問題