Verteilte Software Java RMI 1 lokaler Methodenaufruf Objekt
Verteilte Software - Java - RMI 1 lokaler Methodenaufruf Objekt 1 Methodenaufruf Objekt 2 virtuelle Maschine entfernter Methodenaufruf Objekt 1 RMI virtuelle Maschine RMI Architektur Client Objekt 2 virtuelle Maschine Methodenaufruf Server-Stub (proxy) Skeleton Remote Ref. Schicht Transport Schicht Netzwerkschicht Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 2 <<interface>> java. rmi. Remote java. rmi. Server. Unicast. Remote. Object <<implements>> <<interface>> RMIDemo. Server +int count. String() RMIDemo. Server. Implementation +int count. String() <<uses>> import java. rmi. *; RMIDemo. Client +main() public interface RMIDemo. Server extends Remote { // remote ausführbare Methode des Demo. Servers int count. String(String str) throws Remote. Exception; } Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 3 import java. rmi. *; import java. net. *; import java. rmi. server. *; public class RMIDemo. Server. Implementation extends Unicast. Remote. Object implements RMIDemo. Server { public RMIDemo. Server. Implementation() throws Remote. Exception { try { Naming. rebind("rmi: ///Demo. Server", this); System. out. println("Server gebunden"); } catch (Malformed. URLException e) { // bei falscher URL System. out. println("URL falsch: " + e. get. Message() ) } } public int count. String(String s) { System. out. println(s); return s. length(); } public static void main(String[] args) { try { RMIDemo. Server. Implementation server = new RMIDemo. Server. Implementation(); } catch (Remote. Exception e) { System. out. println("Fehler beim Instanziieren von: " + e. get. Message() ); } } } Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 4 import java. rmi. *; import java. net. *; public class RMIDemo. Client { public static void main(String[] args) { int zeichenanzahl; String s; if (args. length != 1) s = "Aufruf mit java RMIDemo. Client "Zeichenkette""; else s = args[0]; try { // Server in Registry suchen RMIDemo. Server server = (RMIDemo. Server)Naming. lookup("rmi: ///Demo. Server"); if(args. length != 1) System. out. println(s); //Servermethode ausführen zeichenanzahl = server. count. String(s); System. out. println("Anzahl der Zeichen: " + zeichenanzahl); } catch (Not. Bound. Exception e) { System. out. println("Server nicht gebunden: " + e. get. Message() ); } catch (Malformed. URLException e) { System. out. println("URL ungültig: " + e. get. Message() ); } catch (Remote. Exception e) { System. out. println("Fehler bei der Kommunikation: " + e. get. Message() ); } } } Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 5 import java. io. *; public class Aufgabe implements Serializable { double op 1; // erster Operand double op 2; // zweiter Operand char opz; // Operatoionszeichen public void set. Op 1(double v) { op 1 = v; } public void set. Op 2(double v) { op 2 = v; } public void set. Opz(char c) { opz = c; } public double get. Op 1() { return op 1; } public double get. Op 2() { return op 2; } public char get. Opz() { return opz; } } Objekt a Client virtuelle Maschine Server Object by Value virtuelle Maschine Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 6 import java. rmi. *; public interface RMITRServer extends Remote { // remote ausführbare Methode des Demo. Servers double solve(Aufgabe aufg) throws Remote. Exception; } import java. rmi. *; import java. net. *; import java. rmi. server. *; public class RMITRServer. Implementation extends Unicast. Remote. Object implements RMITRServer { public RMITRServer. Implementation() throws Remote. Exception { try { Naming. rebind("rmi: ///TRServer", this); System. out. println("TRServer gebunden"); } catch (Malformed. URLException e) { // bei falscher URL System. out. println("URL falsch: " + e. get. Message() ); } } Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 7 public double solve(Aufgabe a) { double result; System. out. println("Aufgabe: " + a. get. Op 1() + a. get. Opz() + a. get. Op 2()); switch(a. get. Opz()) { case '+': result = a. get. Op 1() case '-': result = a. get. Op 1() case '*': result = a. get. Op 1() case '/': result = a. get. Op 1() case '%': result = a. get. Op 1() default: result = 0. 0; } return result; + * / % a. get. Op 2(); break; break; } public static void main(String[] args) { try { RMITRServer. Implementation server = new RMITRServer. Implementation(); } catch (Remote. Exception e) { System. out. println("Fehler beim Instanziieren von: " + e. get. Message() ); } } } Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 8 import java. rmi. *; import java. net. *; import java. util. *; public class RMITRClient { public static void main(String[] args) { Aufgabe a = new Aufgabe(); double ergebnis; if (args. length != 1) System. out. println("Aufruf mit java RMITRClient "Aufgabe (z. B. 1. 2 * 3. 4)""); else try { // Server in Registry suchen RMITRServer server = (RMITRServer)Naming. lookup("rmi: ///TRServer"); // parse task String. Tokenizer st = new String. Tokenizer(args[0], "+-*/%", true); if( st. has. More. Tokens()) a. set. Op 1(new Double(st. next. Token()). double. Value()); if( st. has. More. Tokens()) a. set. Opz(st. next. Token(). char. At(0)); if( st. has. More. Tokens()) a. set. Op 2(new Double(st. next. Token()). double. Value()); //Servermethode ausführen ergebnis = server. solve(a); System. out. println(args[0] + " = " + ergebnis); } Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 9 catch (Number. Format. Exception e) { System. out. println("Eingabeformat falsch in: " + e. get. Message() ); } catch (Not. Bound. Exception e) { System. out. println("Server nicht gebunden: " + e. get. Message() ); } catch (Malformed. URLException e) { System. out. println("URL ungültig: " + e. get. Message() ); } catch (Remote. Exception e) { System. out. println("Fehler bei der Kommunikation: " + e. get. Message() ); } } } Ausnahmen im RMITRClient Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 10 2. lookup() RMIRegistry Client virtuelle Maschine Client Computer 3. Stub-Objekt (codebase) 4. download Stub-Klasse virtuelle Maschine 1. bind() Server virtuelle Maschine Server Computer WWWServer /codebase WWW-Server Computer Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 11 import java. rmi. *; public interface RMIServer extends Remote { // remote ausführbare Methode des Demo. Servers int count. String(String str) throws Remote. Exception; } import java. rmi. *; import java. net. *; import java. rmi. server. *; public class RMIServer. Implementation extends Unicast. Remote. Object implements RMIServer { public RMIServer. Implementation(String host) throws Remote. Exception { System. set. Security. Manager(new RMISecurity. Manager()); String name = "rmi: //" + host + "/Server"; try { Naming. rebind(name, this); System. out. println("Server gebunden"); } catch (Malformed. URLException e) { // bei falscher URL System. out. println("URL falsch: " + e. get. Message() ); } } Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 12 public int count. String(String s) { System. out. println(s); return s. length(); } public static void main(String[] args) { try { RMIServer. Implementation server = new RMIServer. Implementation(args[0]); } catch (Remote. Exception e) { System. out. println("Fehler beim Instanziieren von: " + e. get. Message() ); } } } policy. all grant { permission java. security. All. Permission "", ""; }; Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 13 import java. rmi. *; import java. net. *; public class RMIClient { public static void main(String[] args) { int zeichenanzahl; String s; if (args. length != 2) { s = "Aufruf mit java RMIClient "; s += "-Djava. security. policy=policy. all host "Zeichenkette""; } else s = args[1]; System. set. Security. Manager(new RMISecurity. Manager()); try { // Server in Registry suchen RMIServer server = (RMIServer)Naming. lookup("rmi: //" + args[0] + "/Server"); if (args. length != 1) System. out. println(s); //Servermethode ausführen zeichenanzahl = server. count. String(s); System. out. println("Anzahl der Zeichen: " + zeichenanzahl); } catch (Not. Bound. Exception e) { System. out. println("Server nicht gebunden: " + e. get. Message() ); } catch (Malformed. URLException e) { System. out. println("URL ungültig: " + e. get. Message() ); } catch (Remote. Exception e) { System. out. println("Fehler bei der Kommunikation: " + e. get. Message() ); } catch (Exception e) { System. out. println("sonstiger Fehler bei: "); e. print. Stack. Trace(); } } } Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
Verteilte Software - Java - RMI 14 server RMIServer. class RMIServer. Implementation_Stub. class RMIServer. Implementation_Skel. class policy. all codebase RMIServer. class RMIServer. Implementation_Stub. class client RMIServer. class RMIClient. class policy. all Prof. Dr. -Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik
- Slides: 14