1 / 41

RMI

RMI. ソフトウェア特論 第 6 回 / 2004-06-04. お知らせ. 6 月 11 日 ( 金 ) の講義は休講となります。. きょうの目標. RMI の基本を復習する。. RMI とは何か. RMI とは. Remote Method Invocation ( 遠隔メソッド呼び出し ) の略 違う Java Virtual Machine 上のメソッドを呼び出す仕組みのこと Java Virtula Machine は、別のホスト上にあってもよい。 クライアント・サーバモデルとなる。. 通常の Java プログラムの場合.

uma-terrell
Download Presentation

RMI

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. RMI ソフトウェア特論 第6回 / 2004-06-04

  2. お知らせ • 6月11日 (金) の講義は休講となります。

  3. きょうの目標 • RMI の基本を復習する。

  4. RMI とは何か

  5. RMI とは • Remote Method Invocation (遠隔メソッド呼び出し) の略 • 違う Java Virtual Machine 上のメソッドを呼び出す仕組みのこと • Java Virtula Machine は、別のホスト上にあってもよい。 • クライアント・サーバモデルとなる。

  6. 通常のJavaプログラムの場合 • Hello クラスのインスタンスを作成する。 • このインスタンスの sayHello メソッドを実行する。

  7. RMIの場合

  8. RMI の場合 • クライアントで Hello クラスのインスタンスを作成する。 • クライアントで、このインスタンスの sayHello メソッドを実行する。 • Hello クラスの実装はサーバ側にある。 • サーバで sayHello メソッドが実行され、返値がクライアントに返される。

  9. RMI だと何がうれしいのか • Hello クラスの実装はサーバ側にあるので、クライアントはサーバ側を呼び出すだけでよい。 • このときクライアントは、メソッドを実行するだけでサーバを呼び出せる。

  10. RMIのしくみ

  11. サーバとクライアント • サーバでは、クライアントから呼び出されるメソッドを実装する。 • クライアントでは、サーバを見つけだして、メソッドを実行する。

  12. スタブとスケルトン • RMI では、通信に必要な処理は「スタブ」と「スケルトン」というクラスに記述される。 • スタブとスケルトンは、サーバのプログラムからツールで生成される。

  13. rmiregistry • サーバの情報を登録しておくための「ネームサーバ」 • クライアントは rmiregistry にアクセスしてサーバのプログラムを探す

  14. RPC (Remote Procedure Call) • RMI の原型となった技術 • Sun Microsystems によって開発された。 • 別のマシン上にある手続きを実行するためのしくみ。 • Unix, Windows で広く普及している。

  15. RMI を構成するプログラム

  16. Remoteインタフェース (1) import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { public String sayHello() throws RemoteException; }

  17. Remoteインタフェース (2) • クライアントから呼び出せるメソッドを定義する。 • サーバは、このインタフェースを実装する。 • このインタフェースをサーバとクライアントで共有する。 • java.rmi.Remote を継承する。 • それぞれのメソッドは、RemoteException を発行できるようにする。

  18. サーバ側のプログラム (1)クラスの定義 public class HelloImpl extends UnicastRemoteObject implements Hello { ...... }

  19. サーバ側のプログラム (2)クラスの定義 • Hello インタフェースを実装する。 • UnicastRemoteObject を継承する。

  20. サーバ側のプログラム (3)コンストラクタとメソッド public HelloImpl() throws RemoteException { super(); } public String sayHello() throws RemoteException { return "Hello world!"; }

  21. サーバ側のプログラム (4)コンストラクタとメソッド • RemoteException を発行するようにする。 • そのため、必ずコンストラクタを用意しなければならない。 • インタフェースで用意されたメソッドを実装する。

  22. サーバ側のプログラム (5)mainメソッド (1) // 許可されてない操作を行わないために if (System.getSecurityManager() == null) { System.setSecurityManager( new RMISecurityManager() ); }

  23. サーバ側のプログラム (6)mainメソッド (2) // インスタンスを生成 HelloImpl obj = new HelloImpl(); // rmi://localhost/HelloServerといった // URIを生成する StringBuffer url = new StringBuffer(); url.append("rmi://"); url.append(args[0]); url.append("/HelloServer");

  24. サーバ側のプログラム (7)mainメソッド (3) // rmiregistry に // HelloImpl を // rmi://localhost/HelloServer という名前で // 登録する Naming.rebind(new String(url), obj);

  25. クライアント側のプログラム (1) // rmi://localhost/HelloServerといった // URIを生成する StringBuffer url = new StringBuffer(); url.append("rmi://"); url.append(args[0]); url.append("/HelloServer");

  26. クライアント側のプログラム (2) // rmiregistry から // rmi://localhost/HelloServer という名前の // オブジェクトを探し、Hello にキャストする Hello obj = (Hello)Naming.lookup( new String(url));

  27. クライアント側のプログラム (3) // Hello オブジェクトの // sayHello メソッドを実行する System.out.println(obj.sayHello());

  28. RMI を動かす

  29. プログラムのコンパイル • javac Hello.java • javac HelloImpl.java • javac HelloClient.java

  30. スタブとスケルトンの生成 • rmic HelloImpl • このコマンドによって、次の2つのクラスが生成される。 • HelloImpl_Stub.class • HelloImpl_Skel.class • rmic –keep HelloImpl を実行することで、スタブとスケルトンのソースファイルを残すことができる。

  31. サーバ側 Hello.class HelloImpl.class スタブ スケルトン policy.txt (後述) クライアント側 Hello.class HelloClient.class policy.txt (後述) サーバ側とクライアント側で用意するプログラム

  32. rmiregistry の起動 • start rmiregistry • このコマンドで rmiregistry を起動 • 起動するフォルダにはクラスファイルを置かない

  33. サーバの起動 (1)コマンドライン java -Djava.rmi.server.codebase= file:///C:\Home\rmi\ -Djava.security.policy=policy.txt HelloImpl localhost

  34. サーバの起動 (2)codebase (1) java.rmi.server.codebase= file:///C:\Home\rmi\ • codebase プロパティでスタブの位置を指定する。 • この場合は、C:\Home\rmi\ にスタブを置いておく。

  35. サーバの起動 (3)codebase (2) • C:\Home\rmi\ • 最後の \ を忘れない • Codebase には Web上の URL を指定することもできる。 • http://www.wakhok.ac.jp/~tomoharu/ • この URL にスタブを置いておく

  36. サーバの起動 (4)codebase (3) • クライアントが起動されると、codebase で指定された URL からスタブがダウンロードされて、クライアントプログラムからスタブを利用できるようになる。

  37. サーバの起動 (5)ポリシーファイルの設定 java.security.policy=policy.txt • policy.txt というファイルでアクセス権を指定できる。

  38. サーバの起動 (6)policy.txt の内容 grant { // Allow everything for now permission java.security.AllPermission; }; • すべての人にすべてのアクセス権を与える

  39. クライアントの起動 • java -Djava.security.policy=policy.txt HelloClient localhost

  40. 注意点 • Cygwin を使うとうまく動かない (原因は不明)。 • プログラムを起動するときには、クラスパスを設定しないこと。 • クラスパスを設定していると、もしクラスパス中にスタブがあった場合、クライアントプログラムはそのスタブをロードするから。

  41. 参考文献・URL • JavaTM Remote Method Invocation (RMI) • http://java.sun.com/j2se/1.4/ja/docs/ja/guide/rmi/ • Sun Microsystems による RMI の解説です。

More Related