ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

RMIによるクラスのダウンロード

 RMIを使って、リモートホストにあるクラスをダウンロードして実行する方法について説明します。 このページでは、RMIについてでは、ローカルホストを使って、RMIの概念を理解していることを前提にしています。

コードベースを使ったRMIの構成

 RMIを使って、リモートホストにあるクラスをダウンロードして実行するためには、Webサーバにあるコードベース(codebase)を利用します。 コードベースとは、JVM(Java Virtual Machine)にクラスをロードするときの、クラスのある位置のことです。
 クライアント側には、インターフェイスモジュールを用意するだけで、ソースを作成することができます。 従って、インターフェイスを変更しなければ、サーバ側のクラスファイルが更新されても、クライアントプログラムを再コンパイルする必要はありません。
 動作の流れとしては、以下のようになります。

 +-----------------+              +-----------------+
 |  +-----------+  |              |  +-----------+  |
 |  |  Client   |  |              |  |  Server   |  |
 |  +-----------+  |              |  +-----------+  |
 |       ↓参照    |              |       ↓登録    |
 |  +-----------+  |              |  +-----------+  |
 |  |  lookup() |  |              |  |  bind()   |  |
 |  +-----------+  |              |  +-----------+  |
 |      ↑ │      |              |       ↓        |
 |      │ │      |              |  +-----------+  |
 |      │ └----------------------->|rmiregistry|  | スタブインスタンスを返却
 |      │         |              |  +-----------+  |
 +------│---------+              +-----------------+
        │                        +-----------------+
        │                        |  +-----------+  |
        │                        |  | Web Server|  |
        │                        |  +-----------+  |
        └---------------------------| codebase  |  | スタブクラスをダウンロード
                                  |  +-----------+  |
                                  +-----------------+

コードベースを使ったプログラミング(サーバ側)

 コードベースを使ったプログラミングでは、以下の手順は、RMIについてと同じものを使っています。
 RMIレジストリを起動する場合は、スタブファイルにCLASSPATHを設定しておかないと、クライアントから接続時にスタブを検索できないためエラーが発生します。

コードベースへのファイルの格納

 以下のファイルをWebサーバからアクセスできる、コードベースディレクトリにコピーします。

unix# cp helloObj_Stub.class /usr/local/apache/htm/rmi/.

 コピーしたら、そのURLにアクセスできることを確認します。

unix# lynx http://www.ash.jp/rmi/

コードベースを使ったプログラミング(クライアント側)

リモートインターフェイスのコピー

 クライアントプログラムを作成するためには、リモートインターフェイス(helloIf.class)が必要ですので、サーバからダウンロードします。

クライアントクラスの作成

 クライアントプログラム(helloClient.java)を作成します。
 プログラムの処理は、レジストリサーバ(www)から、lookupメソッドでリモートインターフェイスを取得し、「Hello World!」を返却するメソッド(helloMsg)を呼び出しています。

helloClient.java
import java.rmi.*;

public class helloClient {
  public static void main(String args[]) {
    helloIf hello = null;
    try {
      // セキュリティマネージャの設定
      System.setSecurityManager(new RMISecurityManager());

      // レジストリサーバの検索
      hello = (helloIf)Naming.lookup("rmi://www.ash.jp/hello");

    } catch(Exception ex) {
      ex.printStackTrace();
    }

    try {
      // メッセージの取得
      System.out.println(hello.helloMsg());

    } catch(Exception ex) {
      ex.printStackTrace();
    }
  }
}

Javaソースのコンパイル

 javacで、ソースファイルをコンパイルします。

unix/dos# javac helloClient.java
unix/dos# ls *.class

helloIf.class
helloClient.class

セキュリティポリシーを記述

 ローカルマシン上でテストする場合は、ポリシーファイル(java.policy)は必要ありませんが、リモートからアクセスする場合には必要となります。 とりあえず、以下のように設定することで、何でも許可されるようになります。 ただしセキュリティ上、問題がありますので、評価時だけ使うようにしてください。

java.policy
grant {
  permission java.security.AllPermission;
};

クライアントプログラムを起動

 クライアントプログラムを起動し、「Hello World!」と表示されれば、成功です。

unix/dos# java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=http://www.ash.jp/rmi/ helloClient
Hello World!


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp