Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik virtuelle Maschine Verteilte Software - Java - RMI 1 Objekt 2Objekt 1 lokaler Methodenaufruf Methodenaufruf virtuelle Maschine Objekt 2Objekt 1 entfernter Methodenaufruf Methodenaufruf RMI RMI Architektur ClientServer Netzwerkschicht Server-Stub (proxy) Remote Ref. Schicht Transport Schicht Remote Ref. Schicht Transport Schicht Skeleton Methodenaufruf
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - RMI 2 java.rmi.Server.UnicastRemoteObject > RMIDemoServer > java.rmi.Remote RMIDemoServerImplementation RMIDemoClient +int countString() > +main() +int countString() import java.rmi.*; public interface RMIDemoServer extends Remote { // remote ausführbare Methode des DemoServers int countString(String str) throws RemoteException; }
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 RMIDemoServerImplementation extends UnicastRemoteObject implements RMIDemoServer { public RMIDemoServerImplementation() throws RemoteException { try { Naming.rebind("rmi:///DemoServer", this); System.out.println("Server gebunden"); } catch (MalformedURLException e) { // bei falscher URL System.out.println("URL falsch: " + e.getMessage() ) } public int countString(String s) { System.out.println(s); return s.length(); } public static void main(String[] args) { try { RMIDemoServerImplementation server = new RMIDemoServerImplementation(); } catch (RemoteException e) { System.out.println("Fehler beim Instanziieren von: " + e.getMessage() ); } }
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 RMIDemoClient { public static void main(String[] args) { int zeichenanzahl; String s; if (args.length != 1) s = "Aufruf mit java RMIDemoClient \"Zeichenkette\""; else s = args[0]; try { // Server in Registry suchen RMIDemoServer server = (RMIDemoServer)Naming.lookup("rmi:///DemoServer"); if(args.length != 1) System.out.println(s); //Servermethode ausführen zeichenanzahl = server.countString(s); System.out.println("Anzahl der Zeichen: " + zeichenanzahl); } catch (NotBoundException e) { System.out.println("Server nicht gebunden: " + e.getMessage() ); } catch (MalformedURLException e) { System.out.println("URL ungültig: " + e.getMessage() ); } catch (RemoteException e) { System.out.println("Fehler bei der Kommunikation: " + e.getMessage() ); } }
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik virtuelle Maschine Verteilte Software - Java - RMI 5 import java.io.*; public class Aufgabe implements Serializable { double op1; // erster Operand double op2; // zweiter Operand char opz; // Operatoionszeichen public void setOp1(double v) { op1 = v; } public void setOp2(double v) { op2 = v; } public void setOpz(char c) { opz = c; } public double getOp1() { return op1; } public double getOp2() { return op2; } public char getOpz() { return opz; } } virtuelle Maschine ClientServer Objekt a Object by Value
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - RMI 6 import java.rmi.*; import java.net.*; import java.rmi.server.*; public class RMITRServerImplementation extends UnicastRemoteObject implements RMITRServer { public RMITRServerImplementation() throws RemoteException { try { Naming.rebind("rmi:///TRServer", this); System.out.println("TRServer gebunden"); } catch (MalformedURLException e) { // bei falscher URL System.out.println("URL falsch: " + e.getMessage() ); } import java.rmi.*; public interface RMITRServer extends Remote { // remote ausführbare Methode des DemoServers double solve(Aufgabe aufg) throws RemoteException; }
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.getOp1() + a.getOpz() + a.getOp2()); switch(a.getOpz()) { case '+': result = a.getOp1() + a.getOp2(); break; case '-': result = a.getOp1() - a.getOp2(); break; case '*': result = a.getOp1() * a.getOp2(); break; case '/': result = a.getOp1() / a.getOp2(); break; case '%': result = a.getOp1() % a.getOp2(); break; default: result = 0.0; } return result; } public static void main(String[] args) { try { RMITRServerImplementation server = new RMITRServerImplementation(); } catch (RemoteException e) { System.out.println("Fehler beim Instanziieren von: " + e.getMessage() ); }
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 StringTokenizer st = new StringTokenizer(args[0], "+-*/%", true); if( st.hasMoreTokens()) a.setOp1(new Double(st.nextToken()).doubleValue()); if( st.hasMoreTokens()) a.setOpz(st.nextToken().charAt(0)); if( st.hasMoreTokens()) a.setOp2(new Double(st.nextToken()).doubleValue()); //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 (NumberFormatException e) { System.out.println("Eingabeformat falsch in: " + e.getMessage() ); } catch (NotBoundException e) { System.out.println("Server nicht gebunden: " + e.getMessage() ); } catch (MalformedURLException e) { System.out.println("URL ungültig: " + e.getMessage() ); } catch (RemoteException e) { System.out.println("Fehler bei der Kommunikation: " + e.getMessage() ); } Ausnahmen im RMITRClient
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Server Computer virtuelle Maschine Verteilte Software - Java - RMI 10 Server Client Computer virtuelle Maschine Client virtuelle Maschine RMI- Registry 1. bind() 2. lookup() 3. Stub-Objekt (codebase) WWW-Server Computer WWW- Server / codebase 4. download Stub-Klasse
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - RMI 11 import java.rmi.*; import java.net.*; import java.rmi.server.*; public class RMIServerImplementation extends UnicastRemoteObject implements RMIServer { public RMIServerImplementation(String host) throws RemoteException { System.setSecurityManager(new RMISecurityManager()); String name = "rmi://" + host + "/Server"; try { Naming.rebind(name, this); System.out.println("Server gebunden"); } catch (MalformedURLException e) { // bei falscher URL System.out.println("URL falsch: " + e.getMessage() ); } import java.rmi.*; public interface RMIServer extends Remote { // remote ausführbare Methode des DemoServers int countString(String str) throws RemoteException; }
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - RMI 12 public int countString(String s) { System.out.println(s); return s.length(); } public static void main(String[] args) { try { RMIServerImplementation server = new RMIServerImplementation(args[0]); } catch (RemoteException e) { System.out.println("Fehler beim Instanziieren von: " + e.getMessage() ); } grant { permission java.security.AllPermission "", ""; }; policy.all
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.setSecurityManager(new RMISecurityManager()); 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.countString(s); System.out.println("Anzahl der Zeichen: " + zeichenanzahl); } catch (NotBoundException e) { System.out.println("Server nicht gebunden: " + e.getMessage() ); } catch (MalformedURLException e) { System.out.println("URL ungültig: " + e.getMessage() ); } catch (RemoteException e) { System.out.println("Fehler bei der Kommunikation: " + e.getMessage() ); } catch (Exception e) { System.out.println("sonstiger Fehler bei: "); e.printStackTrace(); } }
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - RMI 14 RMIServer.class RMIServerImplementation.class RMIServerImplementation_Stub.class RMIServerImplementation_Skel.class policy.all RMIServer.class RMIClient.class policy.all RMIServer.class RMIServerImplementation_Stub.class server client codebase