Java

RMI

RMIとは?

例えば小型デバイスと高性能なPCがあったとします。小型デバイスからデータを送り、PCでそれを処理して小型デバイスに処理内容を返すという仕組みを作りたい場合に、PC上のオブジェクトへの参照を小型デバイスで取得するということができればすごく便利です。

通常オブジェクトは、同じヒープ領域にないと参照ができません。そのため異なるデバイスのオブジェクトを参照するためには、ServerSocketクラスを用いればなんとかできますが、仕組み(コード)がとても複雑になるために難しいです。

ところがなんと!!!

javaには、その複雑になる仕組みがあらかじめ用意されています。

それが、、RMI(Remote Method Invocation)です。

RMIの構造

異なるコンピュータにおいて、オブジェクトは同じヒープ領域にないと参照ができません。なので、ヘルパー(RMIではスタブとスケルトンと言います)というオブジェクトを異なるコンピュータ同士におくことによって、同一のヒープ領域にあるように振る舞うようにします。もちろんヘルパーはClient objectとServer objectはそのものではないです。

RMIアプリケーション(サーバー部分)の作成手順

リモートインターフェースを作成する

リモートインターフェースというのは、クライアントがリモートで呼び出せるメソッドを宣言したインターフェースのことです。このインターフェースは、「サーバーオブジェクト(スタブオブジェクト)への参照」を格納する変数の型として使用できます。スタブとサーバークラスは、このインターフェースを実装します。

リモートインターフェースのサブクラス(サーバークラス)を作成する

クライアントが呼び出すリモートメソッドを含む「本物」のサーバークラスを作成します。クライアントが求める処理は最終的には、このクラスのメソッドによってなされることになります。

 

スタブとスケルトンをrmicツールを使用して作成する

スタブとスケルトンは、プログラマが自作する必要はありません。(それどころかスタブ、スケルトンを構成するクラスのソースコードさえみる必要がない)いずれもrmicというツールを使って自動的に生成します。

RMIレジストリを起動する

RMIレジストリはいわば、「電話帳」みたいなものです。スタブとスケルトンを検索するために使います。

サーバオブジェクトを起動

サーバークラスのクラスファイルを実行すると、サーバークラスがインスタンス化され、RMIレジストリに登録されます。RMIレジストリに登録されたサーバーオブジェクトは、クライアントに利用できるようになります。

RMIアプリケーション(クライアント部分)の作成

クライアント部分においては、同じヒープ上にあるように扱えます。

 参考サイト

http://ash.jp/java/rmi.html