Remote Method Invocation

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

6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
社会人学習講座 「Javaプログラミング概論」
2006年11月22日 植田龍男 Webサービス II (第9回) 年11月22日 植田龍男.
Applet 岡部 祐典 鈴木 敬幸.
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
WebサービスII (第10回) 2007年11月28日 植田龍男.
Javaのための暗黙的に型定義される構造体
Iアプリプログラミング その1  鳥居秀徳.
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
WSDL と JAX-RPC 年10月13日 Webサービス II (第3回) WSDL と JAX-RPC 年10月13日.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
独習Java ・ 12.1  インターネットアドレス ・ 12.2  サーバーソケットとソケット  12月 19日    小笠原 一恵.
WebサービスII (第8回) 2007年11月14日 植田龍男.
JSFによるWebアプリケーション開発 第6回
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
WSDL と JAX-RPC 年10月20日 Webサービス II (第4回) WSDL と JAX-RPC 年10月20日.
第20章 Flyweight ~同じものを共有して無駄をなくす~
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Javaプログラムの実行まで バイト Javaの コード 実行 ソースコード Java ファイル名 ファイル名 abc.java
アルゴリズムとデータ構造 2011年6月20日
RMI ソフトウェア特論 第6回 /
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外
プログラミング言語入門 手続き型言語としてのJava
Java Distributed Objects 1
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
暗黙的に型付けされる構造体の Java言語への導入
WebサービスII (第7回) 2007年11月7日 植田龍男.
第6回 2007年6月1日 応用Java (Java/XML).
EclipseでWekaのAPIを呼び出す
第11週:super/subクラス、継承性、メソッド再定義
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
Java Distributed Objects 1
既存Javaプログラム向け 分散化支援システムの開発
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
ソフトウェア制作論 平成30年11月21日.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
分散 Java プログラムのための アスペクト指向言語
C#プログラミング実習 第3回.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラム分散化のための アスペクト指向言語
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

Remote Method Invocation 00k1126 Hiroko Suzuki

RMI概要 Remote Method Invocation →遠隔メソッド呼び出し 異なるJVM上に存在するオブジェクトのMethodを呼び出す機能を実現するための仕組みである

RMI概要Ⅱ 通信の部分のコードを意識せずにサーバ・クライアントの機能を実現できる JDK1.1以降で標準ライブラリとして提供されている(JDK1.3.0使用) Methodを呼び出す際の引数・戻り値として、オブジェクトを受け渡すことが出来る

RMIの仕組み ServerとClientはinterfaceで結合される ServerはClientに対してオブジェクトの参照(どのMethodが参照可能か)を提供し、Clientはその参照を用いてServerのMethodを呼び出す 上記の機能を成り立たせるためにRegistryを使用する

RMIRegistry 名前付けされたRemote Objectの登録・検索を行うネームサーバである RMIのオブジェクトは一意のURLと名前で登録され、サービスの呼び出しはこのRegistryへの問い合わせによって開始される RMIのプログラムの実行時にはRMIRegistryがバックグラウンドで起動している必要がある

RMI Application 作成手順 Server側 1. Remote Object のInterfaceを作成 2. Remote Object の実装(1.のInterfaceをImplementする) Client側 3. Remote Objectを使うClientを実装

RMI Application 実行手順 ソースコードのコンパイル リモートオブジェクトのコンパイル これによって新しいバイトコードが2つ生成される(StubとSkel)

簡単な例での実装

Example(basic) – Server 側 1. Remote ObjectのInterfaceの定義 Remote Interface はRemoteのサブクラスである Remote Method の定義を記述し、また、RemoteMethodはRemoteExceptionをthrowしなければならない import java.rmi.*; interface HelloWorld extends Remote {  String sayHelloWorld( String name ) throws RemoteException; }

Example(basic) – Server 側 2. Remote Objectの作成 ・UnicastRemoteObjectを継承し、RemoteInterfaceを実装する HelloWorldObj.java public class HelloWorldObj extends UnicastRemoteObject implements HelloWorld

Example(basic) – Server 側 ・ Superclass であるUnicastRemoteObjectのコンストラクタがRemoteExceptionを送出するので、コンストラクタを作成し、RemoteExceptionをthrowするようにする // コンストラクタ  public HelloWorldObj() throws RemoteException { }

Example(basic) – Server 側 ・RMIを利用可能にするためにセキュリティマネジャの設定 ・RMIRegistryへの登録 HelloWorldObj.java // セキュリティマネージャーの設定  System.setSecurityManager ( new RMISecurityManager() ); // サーバー側のリモートオブジェクトを生成  HelloWorldObj obj = new HelloWorldObj(); // リモートオブジェクトに新しい名前を関連付ける  Naming.rebind( "MyObject", obj );

Example(basic) – Client 側 ・ Clientのプログラムを作成し、その中でRemote Objectの名前を引数にしてNaming.lookup Methodを呼ぶ Web Server に入れてアクセスさせる場合はlocalhost の部分にIPaddress もしくはaddressを記述する  // リモートオブジェクトの参照(スタブ)を取得します obj = ( HelloWorld )Naming.lookup ( "rmi://localhost/MyObject" );

Example(basic) – Compile 全体のソースコードをCompile C:\> javac *.java Remote Object の Compile C:\ rmic HelloWorldObj この結果、 HelloWorldObj_Skel.class(スケルトン)と HelloWorldObj_Stub.class(スタブ)がディレクトリ内に生成される。実際に異なるJVMで通信を行うのはこの二つのクラスである。

Example(basic) – Security Policy grant { permission java.security.AllPermission; };

Example(basic) – 実行 NameServerの起動 C:\RmiRegistry > rmiregistry 正常に起動された場合はカーソルが点滅した状態になる RMIServer の起動 実行時に-Dオプションでプロパティの設定をする C:\RMI>java -Djava.security.policy=java.policy   -Djava.rmi.server.codebase= file:///C:/RMI/ HelloWorldObj

Example(basic) – エラー例 java.rmi.ConnectException: Connection refused to host: xxx.xxx.x.xx(IPAddress) RMIRegistry が起動していない java.rmi.AlreadyBoundException: Server Serverという名前のRMIServerがRMIRegistry にもうすでに登録されている java.security.AccessControlException: access denied (java.net.SocketPermission xxx.xxx.x.xxx:xxxx connect,resolve) セキュリティポリシーの設定のエラー

Example(basic) – 実行 Client プログラムを実行する C:\RMI> java –Djava.security.policy=policy HelloWorldClient name Hello name!! と表示されたら成功

Example(basic) – エラー例 java.rmi.ConnectException: Connection refused to host: xxx.xxx.x.xx(IPAddress) Naming.lookup( “rmi://” + addr + “/Server”); addressの記述ミス 名前の記述ミス RMIServerが起動していない

Schedule Management System

Schedule Management System Host上の全ユーザの個人もしくはグループのスケジュールを管理するシステム スケジュールの形態 2003/4/30 開始時刻 終了時刻 内容 メモ 13:30 14:30 Meeting @lab 18:30 19:50 Lesson w4021

Schedule Management System 見た目

Schedule Management System Server Userの管理 Scheduleの管理 Client Scheduleの取得・編集

Schedule Management System ScheduleのAppointment Object : Appointment.class public int start; //start time public int end; //end time public String description; public String memo; //memo public Appointment( int sh, int sm, int eh, int em,   String descrip, String me ) { start = sh * 60 + sm; end = eh * 60 + em; description = descrip; memo = me; }

Schedule Management System ServerはClientのScheduleをHashTableで管理する “2003/4/30”という日付の文字列をKeyとし、 その日のアポイントメントの配列(Appointmentを要素とするVector)を値とするHashTable そのHashTableを値とし、UserNameをKeyとしたHashTableでGroupのScheduleを管理する

Schedule Management System Clientは個人のScheduleを選択し今日の日付のScheduleを得る( Server側のgetDailyApp() Methodを呼ぶ ) ScheduleImpl.java public synchronized Vector getDailyApp( String usr, int year, int month, int day ) throws RemoteException { table = new Hashtable(); Object users=user.get(usr); if( users != null ){ table = ( Hashtable )users; String key = getKey( year,month, day ); Object obj = table.get( key ); if( obj == null ) return null; else return ( Vector )obj; }else return null; }

Schedule Management System Scheduleを編集し、Updateする場合はServer側のupdateDailyApp Methodを呼ぶ。ServerはsendData Methodで同じScheduleを参照しているClientにCallbackで変更を知らせる( sendData() ) ScheduleImpl.java public synchronized void updateDailyApp( String usr, int ye, int mo, int da, Vector v ) throws RemoteException { Object users=user.get( usr ); if( users != null ) table = ( Hashtable )users; String key = getKey( ye, mo, da ); table.put( key, v ); user.put( usr, table ); sendData( usr, key, v ); }

Schedule Management System ServerからClientのメソッドを呼び出す ScheduleImpl.java WhatDaysSch() と outUpdate( Vector v ) メソッドはClient側のメソッドである( RemoteExceptionをthrowしている必要がある ) private void sendData( String usr, String key, Vector v ){ try{ InterfaceClient cl; String str; int rsize = remote_obj.size(); for( int i=0; i<rsize; i++ ){ str = ( String )member.get( i ); if( str.equals( usr )){ cl = ( InterfaceClient )remote_obj.get( i ); if( key.equals( cl.WhatDaysSch() ) ){ cl.outUpdate( v ); }}} }catch( Exception e ){ e.printStackTrace(); }}

Conflictを避けるには Conflictを避けるには 1. TimeTable上のクリックした時間だけedit不可にする   →1 Day Schedule の編集の柔軟性を高める 2. Edit WindowでそのAppointmentの優先度を選択出来るようにする 重要度で置き換えられたAppointment はどうするか? 1. 近い時間に移動する 2. 削除されたAppointmentを保管しておくVectorを作る 指定した時間後にそのデータを破棄する 3. その場で再編集