0

クライアントにはすべての実装が必要ですか、それともインターフェイスだけが必要ですか?

詳細: リモートインターフェース Foo を用意しましょう:

public interface Foo extends Remote {
    FooMessage getFooMessage () throws RemoteException;
    void setFooMessage (FooMessage fm) throws RemoteException;
}

クライアントとサーバー間の通信は、FooMessage によって行われます。

public interface FooMessage {
    String getMsg ();
    void setMsg (String str);  
}

クライアントは非常に単純です。

public void clientCode () {
    Foo foo = (Foo)Naming.lookup ("rmi://localhost/FooService");
    FooMessage msg = foo.getFooMessage ();
    msg.setMsg ("asdf");
    foo.setFooMessage (msg);
}

Foo と FooMessage の両方に、サーバー側で具体的な実装が必要です。問題は、クライアントもこれらの実装を持つべきか、それとも RMI メカニズムが暗黙的に実装を転送するべきかということです。

4

1 に答える 1

1

具体的な実装クラスは、RMIクラスローダーを使用して、サーバーからクライアントによってロードできます。ただし、覚えておくべき一般的な「落とし穴」があります。

  1. クライアントがインストールされていない限り、RMIクラスローダーは無効になりますSecurityManager。これは、クライアントに提供される悪意のあるコードのアクションを制限することを目的としています。
  2. サーバーは、クライアントがアクセスできる「コードベース」を指定する必要があります。これはfile:、共有ファイルシステム、http:サーバーなどのURLである可能性があります。これは、java.rmi.server.codebaseシステムプロパティで指定されます。

(注:リンクされたガイドは便利ですが、「スタブ」について多くのことを説明しています。Java5以降、実行時にクライアントによって動的に生成されるスタブを使用するのが最も一般的です。このメカニズムは、必要な他のクラスに適用されます。ただし、共有されます。)

于 2009-09-29T19:23:11.217 に答える