JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > RMI編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/02/03  田中宏和
Last Update 2003/1/6
RMI編
◆RMIとは?
RMIとはRemote Method Invocationの略です。RMIを用いると、別のコンピューターにあるJavaのオブジェクトのメソッドを呼ぶことができます。
◆ここでの環境
OS Windows 2000
J2SE SDK 1.4.0
◆Java実行環境の構築
アプリケーション編を参考にJavaの実行環境を構築してください。
◆使用するソース
HelloWorld.java リモートインターフェイス
HelloWorldObj.java リモートオブジェクト
HelloWorldClient.java リモートメソッドを呼び出すクライアント
◆サーバー側のプログラムの作成
サーバー側(メソッドが呼び出される側)のプログラムから作成します。
リモートから利用されるオブジェクトは必ずリモートインターフェースを実装(implements)しなければなりませんので、まずリモートインターフェースを作ります。
リモートインターフェースはインターフェースRemoteを継承(extends)しなければなりません。
extends Remote

リモートインターフェースには呼び出されるメソッド(リモートメソッド)の定義を記述します。また、リモートメソッドはRemoteExceptionをスローする必要があります。
String sayHelloWorld() throws RemoteException;
■リモートインターフェース
HelloWorld.java(ここからダウンロード)
import java.rmi.*;
interface HelloWorld extends Remote {
String sayHelloWorld() throws RemoteException;
}
次にリモートオブジェクトを作成します。
まず、UnicastRemoteObjectを継承(extends)し、上で作ったリモートインターフェースを実装(implements)します。
extends UnicastRemoteObject implements HelloWorld

コンストラクタを作成してRemoteExceptionをスローするようにするにします。
public HelloWorldObj() throws RemoteException {
}


リモートメソッドを中身も含めて記述します。リモートメソッドはRemoteExceptionをスローするようにします。
public String sayHelloWorld() throws RemoteException {
  return "Hello World";
}


ここでは mainメソッドでRMIレジストリへのリモートオブジェクトの登録も行っています。このmainメソッドの処理をRMIレジストリ登録用のクラスを作って行わせてもOKです。
■リモートオブジェクト
HelloWorldObj.java(ここからダウンロード)
import java.rmi.*;
import java.rmi.server.*; 

public class HelloWorldObj extends UnicastRemoteObject implements HelloWorld {
  public static void main(String args[]) { 
    if (System.getSecurityManager() == null) {
      // セキュリティマネージャーを設定します
      System.setSecurityManager(new RMISecurityManager()); 
    } 
    try {
      // サーバー側のリモートオブジェクトを生成します
      HelloWorldObj obj = new HelloWorldObj();
      // リモートオブジェクトに新しい名前を関連付けます 
      Naming.rebind("MyObject", obj); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  }
  // コンストラクタ
  public HelloWorldObj() throws RemoteException {
  }
  // "Hello World"と返すリモートメソッド
  public String sayHelloWorld() throws RemoteException {
    return "Hello World";
  }
}
 
 
◆サーバー側プログラムのコンパイル
次にコンパイルしてみましょう。RMIではrmicという専用のコンパイラを使用します。
コマンドプロンプト
C:\JavaHello\RMI>rmic HelloWorldObj

C:\JavaHello\RMI>
コンバイルが成功すると以下の4つのファイルが生成されます。
HelloWorld.class リモートインターフェイス
HelloWorldObj.class リモートオブジェクト
HelloWorldObj_Stab.class スタブ
HelloWorldObj_Skel.class スケルトン
上の2つのクラスは通常のコンパイルで生成されるものです。下の2つのクラスを、スタブスケルトンといいます。実際に離れたコンピューター同士で通信するのはこの2つのクラスです。スタブリモートオブジェクトと同じメソッドを持っていて、クライアント側(呼び出し側)からそのメソッドが呼ばれるとその情報をスケルトンに送ります。スケルトンリモートオブジェクトのメソッドを呼んでその戻り値をスタブに返します。スタブはそれをクライアント側(呼び出し側)に返すという流れです。
- RMIの全体の流れ -
 
◆クライアント側のプログラムの作成
次にクライアント側のプログラムを作成します。
HelloWorldClient.java(ここからダウンロード)
import java.rmi.*;

public class HelloWorldClient {
  public static void main(String args[]) {
    HelloWorld obj = null;
    try {
      // セキュリティマネージャーを設定します
      System.setSecurityManager(new RMISecurityManager());
      // リモートオブジェクトの参照(スタブ)を取得します
      obj = (HelloWorld)Naming.lookup("rmi://localhost/MyObject");
      // リモートメソッドを呼び出してその戻り値を画面に表示します
      System.out.println(obj.sayHelloWorld());
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}
 
 
◆クライアント側のプログラムのコンパイル
コマンドプロンプト
C:\JavaHello\RMI>javac HelloWorldClient.java

C:\JavaHello\RMI>
これで、すべてのクラスが準備できました。
◆RMIレジストリの起動
最初にRMIレジストリを起動しなければなりません。RMIレジストリとは、リモートオブジェクトの参照(スタブ)の場所を特定するために使わる簡単なネームサーバーです。rmiregistryというコマンドで起動できます。rmiregistryを起動するフォルダにはクラスファイルが存在しないようにしてください。また、起動する前に、CLASSPATHの値をクリアしておきましょう。CLASSPATHの中にスタブクラスが含まれている場合は、RMIレジストリにリモートオブジェクトを登録するプログラムの実行時に動的なスタブクラスのロード(java.rmi.server.codebaseプロパティでの指定)ができなくなってしまいます。
コマンドプロンプト
C:\>set CLASSPATH=

C:\>rmiregistry
正常に起動された場合は、カーソルが点滅した状態になります。
◆リモートオブジェクトをRMIレジストリへ登録
サーバー側のプログラムを実行してRMIレジストリにリモートオブジェクトを登録します。 起動するためには、セキュリティポリシーでRMIレジストリへの接続を許可しなければなりません。java.policyファイルを以下のように作成してください。
java.policy(ここからダウンロード)
grant {
permission java.security.AllPermission;
};
ここでは、動きさえすればいいのですべて許可に設定します。 -Dオプションで、java.policyのファイルの場所と、スタブクラスがあるフォルダのURLを指定しましょう 。プロパティの意味を簡単に説明します。
java.security.policy javaのセキュリティポリシーの情報が書かれたファイルを指定します
java.rmi.server.codebase スタブクラスをロードするために、スタブクラスを検索するフォルダのURLを指定します。
新しいMS-DOSプロンプト(コマンドプロンプト)起動して以下のようにRMIレジストリに登録するプログラムを実行します。(実際は改行しないで1行で実行してください)
コマンドプロンプト
C:\JavaHello\RMI>java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=file:///C:\JavaHello\RMI\ HelloWorldObj
正常に実行された場合は、カーソルが点滅した状態で何もエラーメッセージが表示されません。
 
◆クライアントのプログラムの実行
新しいMS-DOSプロンプト(コマンドプロンプト)を起動してクライアントのプログラムを実行してみましょう!
コマンドプロンプト
C:\JavaHello\RMI>java -Djava.security.policy=java.policy HelloWorldClient
Hello World

C:\JavaHello\RMI>

おおおお!表示されましたね!
 
(参考)
ここではリモートオブジェクトがあるコンピューターと同じコンピューターでクライアントプログラムを実行しましたが、クライアントプログラムのコードを以下のように変更すれば別のコンピューターでクライアントプログラムを実行できます。
Naming.lookup("rmi://localhost/MyObject");
      ↓
Naming.lookup("rmi://<RMIレジストリが動いてるサーバーのアドレス>/MyObject");
(例)
Naming.lookup("rmi://192.168.1.1/MyObject");
クライアントプログラムを実行するには、java.policyファイル、クライアントプログラムから使うリモートインターフェース、スタブクラスの3つのファイルが必要なので、この3つのファイルも別のコンピューターに持っていきます。
■関連
RMI(アプレット)編
■書籍
Java関連の書籍

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME