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(); } } } |
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! |