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

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

Web サービス II ( 第 13 回 )‏ 2008 年 1 月 9 日 植田龍男. 本日の目的 Web サービスの歴史と将来の展望 (1) WSDL 2.0 の登場 ‏ Jersey プロジェクト Ver 0.5 による開発.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
WebサービスII (第12回)‏ 2007年12月19日 植田龍男.
モバイルエージェントシステムの実装 エージェント移動(状態とコードの一括移送) エージェント移動の特徴 システム構成 エージェントプログラム
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
社会人学習講座 「Javaプログラミング概論」
難しいことは置いといて、 取り合えず 「BlazeDS」 を使って、 Flash、AIRアプリから Javaオブジェクトのメソッドを呼び出すための 手順書(Windows版) 2008年2月 Lecce.
Remote Method Invocation
2006年11月15日 植田龍男 Webサービス II (第8回) 年11月15日 植田龍男.
2006年11月22日 植田龍男 Webサービス II (第9回) 年11月22日 植田龍男.
Applet 岡部 祐典 鈴木 敬幸.
WebサービスII (第10回) 2007年11月28日 植田龍男.
JSFによるWebアプリケーション開発 第11回
Servlet J2EE I 第8回 /
アプレット (Applet)について.
アルゴリズムとプログラミング (Algorithms and Programming)
ネットワークプログラミング論 平成27年10月12日 森田 彦.
WSDL と JAX-RPC 年10月13日 Webサービス II (第3回) WSDL と JAX-RPC 年10月13日.
Java I 第2回 (9/22).
JavaServlet&JSP入門 01K0018 中村太一.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
WebサービスII (第8回) 2007年11月14日 植田龍男.
HTTPプロトコルとJSP (1) データベース論 第3回.
社会人学習講座 「Javaプログラミング概論」
JavaBeans とJSP データベース論 第5回.
WSDL と JAX-RPC 年10月20日 Webサービス II (第4回) WSDL と JAX-RPC 年10月20日.
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Javaプログラムの実行まで バイト Javaの コード 実行 ソースコード Java ファイル名 ファイル名 abc.java
ネットワークプログラミング論 平成28年10月17日 森田 彦.
コンパイラの解析 (2) GCJのデータ構造 - 1.
Webサービスを使った クライアント・プログラム
Stateful Session Beans
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
Java Distributed Objects 1
アルゴリズムとプログラミング (Algorithms and Programming)
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
WebサービスII (第7回) 2007年11月7日 植田龍男.
コンパイラの解析 (3) クラスとインスタンスの初期化.
Javaによる Webアプリケーション入門 第6回
Nakano School of Business 経営情報ビジネス科 【 Java概論(Test5)】
Javaプログラムの変更を支援する 影響波及解析システム
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
Jakarta Struts (2) ソフトウェア特論 第11回.
Java Distributed Objects 1
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
2006年11月8日 植田龍男 Webサービス II (第7回) 年11月8日 植田龍男.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
Servlet ソフトウェア特論 第7回.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
Servlet J2EE I (データベース論) 第12回 /
Servlet データベース論 第6回.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
C#プログラミング実習 第3回.
Javaによる Webアプリケーション入門 第4回
サブゼミ第7回 実装編① オブジェクト型とキャスト.
WebアプリケーションとTomcat ― これまでの復習とこれからの予習 ―
プログラム分散化のための アスペクト指向言語
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
JAVA入門⑥ クラスとインスタンス.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

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

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

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

RMI とは何か

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

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

RMIの場合

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

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

RMIのしくみ

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

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

rmiregistry サーバの情報を登録しておくための「ネームサーバ」

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

RMI を構成するプログラム

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

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

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

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

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

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

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

サーバ側のプログラム (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");

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

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

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

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

RMI を動かす

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

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

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

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

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

サーバの起動 (2) codebase (1) java.rmi.server.codebase= file:///C:\Home\rmi\

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

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

サーバの起動 (5) ポリシーファイルの設定 java.security.policy=policy.txt

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

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

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

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