2013年10月9日水曜日

JavaのRMIをつくるには


実装すべき内容
・サーバに名前をつけたインスタンスを保持させる
・クライアントはサーバにあるインスタンスを操作する
・クライアントでは、interfaceを持っているだけで、実装はサーバで行う。

サーバに名前をつけたインスタンスを保持させる
これは簡単で、HashMapを使用する。
KeyをStringにして名前を入れてしまえばよいからだ。


クライアントはサーバにあるインスタンスを操作する
これがめんどうである。
簡潔に言えば、プロキシインスタンスを作成しメソッドを実行したら、そのメソッド名と引数をサーバへ送り、サーバで実行し結果をクライアントへ返すという工程だ。

そして、この前段階にサーバのプロトコルを決めておこう。
RMIでは、サーバのアドレスとインスタンスの名前を送ることで、プロキシインスタンスを作成しているので、これに習ってみる。
ObjectOutputStreamでStringで名前を送る。
サーバでは、Stringを受信した時に、クライアントでプロキシインスタンスを作成するためのinterfaceを送信する必要がある。
なので、名前をつけて登録したインスタンスから共通のinterfaceを取り出すことにした。
reflectionを使用することで、インスタンスへ実装されているinterfaceの配列を取り出すことができる。
取り出すために、共通のinterfaceにはシンボルとして、Comfaceというinterfaceを作成し継承させることにした。
interfaceの配列からComfaceを継承しているものをクライアントへ送り、それでプロキシインスタンスを作成する。

次に、私はサーバにあるインスタンス名、実行したメソッド名、メソッドの引数の型、引数、を保持するクラスを作成した。
この際、シリアライズできるようにSerializableを実装する。
サーバでは、このオブジェクトの時にはメソッドの実行をするようにする。

プロキシインスタンスでは、InvocationHandlerを実装したクラスを渡すことで、メソッドの実行に細工ができる。
メソッドの実行時には、メソッドの名前や渡された引数がわかるので、それをサーバに送る事でRMIの真似事ができるのだ。
void型などのメソッドには気を付けること。








0 件のコメント:

コメントを投稿