Java Distributed Objects 1

Slides:



Advertisements
Similar presentations
復習ー I (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー.
Advertisements

Java セキュリティ(その1) 萩谷 昌己 (東京大学) with the help of 戸沢 晶彦 (東京大学)
Apache Camel Data Format Component Apache Camel
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Remote Method Invocation
マルチスレッド処理 (II) Multithreading
自社製ミドルウエアをDalvikと連携させることが可能になる
Applet 岡部 祐典 鈴木 敬幸.
Apache Camel Data Format Component Apache Camel
とても使いやすい Boost の serialization
アルゴリズムとプログラミング (Algorithms and Programming)
とても使いやすい Boost の serialization
Apache Camel Data Format Component Apache Camel
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
JavaServlet&JSP入門 01K0018 中村太一.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
独習Java ・ 12.1  インターネットアドレス ・ 12.2  サーバーソケットとソケット  12月 19日    小笠原 一恵.
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
第20章 Flyweight ~同じものを共有して無駄をなくす~
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Bridge Pattern
オブジェクト指向入門.
第12回独習Javaゼミ 12章セクション3~4 発表者 直江 宗紀.
アルゴリズムとデータ構造 2011年6月20日
CONCURRENT PROGRAMMING
RMI ソフトウェア特論 第6回 /
相関ルールマイニングを用いた メソッドの命名方法の分析
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外
変数のスコープ クラス クラス変数 すべてのメソッドの外側でstaticで定義
プログラミング言語入門 手続き型言語としてのJava
Java Distributed Objects 3
アルゴリズムとプログラミング (Algorithms and Programming)
UDPマルチキャストチャット                    空川幸司.
例外処理 と ファイル入出力 情報システム学科 平塚 聖敏.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
安全なモバイルエージェント システム Flyingware のための 仮想ディスクの実現
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
リファレンス,配列,例外処理 その他演習に役立つこと
暗号技術 ~JAVAプログラム③~ (7週目)
日本Androidの会 事務局長 SIPropプロジェクト 代表 グロースエクスパートナーズ 今村 謙之(いまむら のりつな)
第3回 2007年4月27日 応用Java (Java/XML).
WebサービスII (第7回) 2007年11月7日 植田龍男.
暗号技術 ~JAVAプログラム①~ (5週目)
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
Java Distributed Objects 1
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
ソフトウェア制作論 平成30年11月21日.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
暗号技術 ~JAVAプログラム②~ (6週目)
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向 プログラミング 第四回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
値渡しと参照渡しについて.
第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
7-3 サービスの連携 1.サービスとは 画面を持たずに処理を行う【AndroidManifest.xmlへの追加】 …
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

Java Distributed Objects 1 Masayuki Iwai tailor@ht.sfc.keio.ac.jp 2007 10 11

Table of contents 第1回10月11日木曜日5限 第2回10月19日金曜日6限 Rmi Advanced tutorial Distibuted objectsの目指す世界 Rmi 以前 tutorial Rmi tutorial 第2回10月19日金曜日6限 Rmi Advanced tutorial custom socket package Activatable 第3回10月17日木曜日5限 Jini programming Java Space programming Distributed Objectsの世界

Distibuted objectsの目指す世界 タスクの依頼 自由な連携 take write take write read

Local Method Invocation LocalClass localClass=new LocalClass(); outputObj=localClass.method(inputObj); inputObjはprimitive型でない限りcall by referenceとして渡される。 LocalRuntime LocalMainClass 192.168.0.1

メソッドの引数と返り値について call by reference 参照渡し call by value 値渡し

CallbyTestMain package jp.ac.sfc.keio.sfc.tailor.callbyLocal; public class CallbyTestMain extends Thread { String str = "0"; StringBuffer sbuf = new StringBuffer("0"); int i = 0; TestObj obj = new TestObj(); public static void main(String args[]) { CallbyTestMain calltester = new CallbyTestMain(); calltester.start(); } public void run() { CallTesterLocalMethods funcs = new CallTesterLocalMethods(); funcs.setStringBuffer(sbuf); funcs.setString(str); funcs.setPrimitive(i); funcs.setObject(obj); System.out.println("Primitive:"+i); System.out.println("String:"+str); System.out.println("StringBuffer:"+sbuf); obj.printTestObj(); System.out.println("=========== LOOP START============"); while (i < 4) { { i++; str=""+i; sbuf.append(i); obj.increment(); } System.out.println("----------------------------------"); funcs.printPrimitive(); funcs.printString(); funcs.printStringBuffer(); funcs.printObject(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); }//whie end System.out.println("=========== LOOP END============"); System.out.println("Primitive:"+i); System.out.println("String:"+str); System.out.println("StringBuffer:"+sbuf); obj.printTestObj();

CallTesterLocalMethods package jp.ac.sfc.keio.sfc.tailor.callbyLocal; public class CallTesterLocalMethods { private int i; private String str; private StringBuffer sbuf; private TestObj obj; void setPrimitive(int i) { this.i = i; } void printPrimitive() { System.out.println("Primitive:" + i); void setString(String str) { this.str = str; void printString() { System.out.println("String:"+str); public void setStringBuffer(StringBuffer sbuf) { this.sbuf=sbuf; void printStringBuffer() { System.out.println("StringBuffer:"+sbuf); void setObject(TestObj obj) { this.obj = obj; void printObject() { obj.printTestObj();

TestObj package jp.ac.sfc.keio.sfc.tailor.callbyLocal; public class TestObj { private int i=0; public void increment(){ i++; } public void printTestObj(){ System.out.println("Object:"+i);

動きを予想してみよう。 Primitive:0 String:0 StringBuffer:0 Object:0 =========== LOOP START============ ---------------------------------- Primitive:【 】 String:【 】 StringBuffer:【 】 Object:【 】 =========== LOOP END============

RMI:Remote Method Invocation Remote Classのmethodを Callbyreferenceで呼びたいのがRMI RemoteClass RemoteRuntime method 192.168.0.2 LocalRuntime LocalMainClass 192.168.0.1

RMI:OutputStream ソケットの作成が必要 Bytedataのみをコピー可能 A B ByteData OutputStream VM_A VM_B

RMI:ObjectOutputStream java.io.Serializableを実装したオブジェクト Objectを一時直列化しネットワークを経由してコピーを行う BがCをよみがえらせるには,Cのクラスファイルが必要 C C A B 0100101001010 ObjectOutputStream VM_A VM_B

Dateオブジェクトの移動 Dateクラスは、Serializableインターフェースを実装している。 直列化可能という意味のマークキングインタフェース Methodは持たない。 移動させたいObjectクラス定義の際に、 Serializable を実装

Interfaceによるremoteでのオブジェクト復元 Inferfaceでキャストすることで //Mony money= new MonyImpl(); Mony money= new MonyImpl2(); 移動オブジェクトの実装変更が可能 呼び出し先では常に Mony money = (Mony) (ois.readObject()); money.printMoney(); money.increment(); しかし、objectの移動にもかかわらずcall by referenceでない。

Castは万能か? 実はディレクトリを分けると Remote側で以下のエラーがおこる。 java.lang.ClassCastException: jp.ac.sfc.keio.sfc.tailor.remote.withinterface2.local.MonyImpl2 cannot be cast to jp.ac.sfc.keio.sfc.tailor.remote.withinterface2.remote.Mony の Inferaceだけではだめ 実はキャスト(オブジェクト復元)にはimpleクラスがいるのだ

NetworkClassLoaderで実装クラスを呼び寄せる。 import java.util.*; import java.io.*; import java.net.*; public class NetworkClassLoader extends ClassLoader { InputStream in = null; ByteArrayOutputStream out = new ByteArrayOutputStream(1024); public NetworkClassLoader(){ this("localhost",8081); } public NetworkClassLoader(String host, int port){ try { Socket s = new Socket(host,port); in = s.getInputStream(); } catch (Throwable e) { e.printStackTrace(); protected Class findClass( String name ) throws ClassNotFoundException { try { byte buff[] = new byte[1024]; int n,m; int len=0; while ((n = in.read(buff, 0 , 1024)) >= 0) { out.write(buff,0,n); len += n ; } byte data[] = new byte[len]; data=out.toByteArray(); return defineClass(null, data, 0, len); } catch (Throwable e) { e.printStackTrace(); throw new ClassNotFoundException();

rmic -v1.2 MoneyRemoteImple start rmiregistry rmiregistry & java -Djava.rmi.server.codebase=file:/C:workspace\ -Djava.security.policy=policy.txt MoneyRemoteImple

RMI:Bの側にCのクラスファイルがない場合 Interfaceを利用したCastだけではだめ BはCを保持しておく必要がないが最終的にはCの情報が必要->NetworkClassLoader Cの情報をダウンロード C NetworkClassServer NetworkClassLoader interface C C C’ A serializable B C 0100101001010 ObjectOutputStream VM_A VM_B

RMI:すこし立ち止まって クラスサーバは果たしてLocalRuntimeにある必要はあるのか? Cの情報をダウンロード C NetworkClassServer NetworkClassServer interface C C C’ A serializable B C 0100101001010 ObjectOutputStream VM_A VM_B

RMI:Marshalled Object MarshalledObject=serialized object+そのロード元 (可能な場合) となるコードベース URL BはCを知る必要がない:webserverは何処にあってもよい:動作はVM_B上 C http/get websrver Cクラスの解決情報 C C C C C’ A serializable B ObjectOutputStream VM_A VM_B

RMI: MarshalledObjectの実装 public final class MarshalledObject implements Serializable { /** * @serial Bytes of serialized representation. If <code>objBytes</code> is * <code>null</code> then the object marshalled was a <code>null</code> * reference. */ private byte[] objBytes = null; * @serial Bytes of location annotations, which are ignored by * <code>equals</code>. If <code>locBytes</code> is null, there were no * non-<code>null</code> annotations during marshalling. private byte[] locBytes = null; * @serial Stored hash code of contained object. * * @see #hashCode }

RMI:Object I/O Streamの2つの問題 オブジェクト単位 public class Account implements Serializable{ public void setMoney(){….} public Money getMony(){….} public void addMony(){….} public void subMony(){….} } =================書き出す側 VM_A=================== Socket s = ss.accept(); ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); Account acc= Bank.getAccount(me); oos.writeObject(acc); s.close(); =================読み出す側 VM_B=================== ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); Account acc= (Account) (ois.readObject()); acc.addMony(1000); AccountクラスってRemoteに最新のものあるの? これって変更されるのRemoteのAccountクラスだよね

RMI: Socket/ObjectStreamレベルのことはStabが行う。 Stabクラスはrmic –v1.2 ServerClassのコマンドで生成 実はMarshalledObjectを利用してRMIは実装されている。 コードベースのためWebserverが必要 スタブオブジェクトが必要:動作はVM_A上 C クラスCは必要ない WEBSERVER インタフェースC’ UnicastRemoteObject C C C’ A C_stub C_stub B RMI VM_A VM_B

RMI:SocketProgrammingではない。 =================サーバ側 VM_A=================== public class AccountImple extends UnicastRemoteObject implements IAccount{ } AccountImple acc= Bank.getAccountImple (me); Naming.rebind(“registryhostname/Account_Iwai”,acc); 起動方法 >>java MainClass java.rmi.server.codebase=http://codebasehost/accout.jar =================クライアンド側 VM_B=================== String location = "rmi://registryhostname/Account_Iwai" ; acc=(IAccount)Naming.lookup(location); acc.addMony(1000); Socketプログラミングあらたな問題