RMIの入門の3回目、クライアント編です。
interfaceさえ書けば、サーバから書こうとクライアントから書こうと勝手です。interfaceによってサーバ側の実装とクライアント側の実装を完全に分離できる、というのが重要です。
クライアント側としてはローカルなオブジェクトのメソッド呼び出しも、リモートオブジェクトのメソッド呼び出しも(引数や戻り値の扱いが多少違うにせよ)あまり変わりません。ローカルオブジェクトはnew等で生成するのに対して、リモートオブジェクトの場合はRMIレジストリから(そのスタブを)取ってくるくらいです。
import java.rmi.RemoteException;
public class EnvironmentClient {
public void printJavaVersion() {
ServerEnvironment se = null;
try {
se = Naming.lookup("//localhost/ServerEnvironment");
System.out.println("Java VM version = "
+ se.getJavaVersion());
} catch (RemoteException e) {
System.err.println(e);
System.exit(1);
}
}
public static void main(String[] args) {
EnvironmentClient ec = new EnvironmentClient();
ec.printJavaVersion();
}
}
Naming.lookup()に渡す引数は、サーバ側でbindしたのと同じ名前を指定します。またリモートオブジェクトの参照がinterfaceになっているのが判ると思います。
プログラムはこれで終わりです。あとはjavacでコンパイルし、さらにRMI用interfaceを実装したサーバ側のクラスをrmicにかけてスタブの作成を行えば実効可能になります。実行にはrmiregistryを、クラスパスに気をつけて動かしておき、サーバ側、クライアント側を動かします。
RMIはJavaのコアパッケージだけで簡単に分散プログラムを実現できることがわかると思います。