理系学生日記

おまえはいつまで学生気分なのか

RMI を試す!

Java にはリモートにあるオブジェクトのメソッドを,ローカルにあるように呼び出せる RMI という仕組みがあります.あるんだったら試さないといけないし,そうしないと死ぬ.

実験するために,リモートにあるサーバで足し算をするようなもんを作ります.
RMI をテストするためには,まず java.rmi.Remote を拡張するリモートインタフェースを作ります.今回はこんな感じですね.

package rmitest.sum;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RMISum extends Remote {
	int calcSum(int min, int max) throws RemoteException;
}

後はサーバとクライアントを作れば良い.
サーバはこれ.クライアントからのリクエストを受け付けられるようにしたり,クライアントがリモートオブジェクトを見つけられるようにしたりするんですけど,良い感じで抽象化されていて,ぼくはなんかよくわからんけど使ってるみたいなクソな感じだけどオールオッケーだ!

package rmitest.sum;

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class RMIServer implements RMISum {

	public int calcSum(int min, int max) {
		int retval = 0;
		for (int i = min; i <= max; i++) {
			retval += i;
		}
		return retval;
	}
	
	public static void main(String[] args) {
		try {
			RMIServer server = new RMIServer();
			RMISum stub = (RMISum)UnicastRemoteObject.exportObject(server, 0);
			
			Registry registry = LocateRegistry.getRegistry();
			registry.bind("sum", stub);

			System.err.println("Server ready");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

クライアントは,リモートオブジェクトを見つけて,メソッド呼び出しをするだけですね.

package rmitest.sum;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIClient {
	public static void main(String[] args) {
		String host = (args.length < 1)? null : args[0];
		try {
			Registry registry = LocateRegistry.getRegistry(host);
			RMISum stub = (RMISum)registry.lookup("sum");
			int sum = stub.calcSum(1, 10);
			System.out.println("sum=" + sum);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

サーバをリモートで動作させた後,クライアントを動作させる.

$ java rmitest.sum.RMIClient 192.168.1.3
sum=55

おーーーーできた!!!!