Presentation is loading. Please wait.

Presentation is loading. Please wait.

J0 1 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento.

Similar presentations


Presentation on theme: "J0 1 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento."— Presentation transcript:

1 J0 1 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Java Networking Remote Method Invokation

2 J0 2 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Object 1Object 2 invoke method respond Object Oriented Paradigm

3 J0 3 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Object 1Object 2 invoke method respond Client Host/Process Server Host/Process Distributed Object Oriented Paradigm

4 J0 4 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Object 1Object 2 socket interaction Local – Client Host/Process Remote - Server Host/Process Post Office Distributed Object Oriented: implementation

5 J0 5 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Object 1Object 2 magic Local – Client Host/Process Remote- Server Host/Process Ghost of Object 2 (stub) Skeleton of Object 2 Distributed Object Oriented: RMI paradigm

6 J0 6 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento CLIENT & SERVER: iCalendar (interface) import java.rmi.*; public interface iCalendar extends Remote { java.util.Date getDate () throws RemoteException; } 1. Define the common interface

7 J0 7 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento SERVER: CalendarImpl import java.util.Date; import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; public class CalendarImpl extends UnicastRemoteObject implements iCalendar { public CalendarImpl() throws RemoteException {} public Date getDate () throws RemoteException { return new Date(); } public static void main(String args[]) { CalendarImpl cal; try { LocateRegistry.createRegistry(1099); cal = new CalendarImpl(); Naming.bind("rmi:///CalendarImpl", cal); System.out.println("Ready for RMI's"); } catch (Exception e) {e.printStackTrace()} } 2. Implement the service

8 J0 8 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento SERVER: CalendarImpl import java.util.Date; import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; public class CalendarImpl extends UnicastRemoteObject implements iCalendar { public CalendarImpl() throws RemoteException {} public Date getDate () throws RemoteException { return new Date(); } public static void main(String args[]) { CalendarImpl cal; try { LocateRegistry.createRegistry(1099); cal = new CalendarImpl(); Naming.bind("rmi:///CalendarImpl", cal); System.out.println("Ready for RMI's"); } catch (Exception e) {e.printStackTrace()} } 3. Create Registry

9 J0 9 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento SERVER: CalendarImpl import java.util.Date; import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; public class CalendarImpl extends UnicastRemoteObject implements iCalendar { public CalendarImpl() throws RemoteException {} public Date getDate () throws RemoteException { return new Date(); } public static void main(String args[]) { CalendarImpl cal; try { LocateRegistry.createRegistry(1099); cal = new CalendarImpl(); Naming.bind("rmi:///CalendarImpl", cal); System.out.println("Ready for RMI's"); } catch (Exception e) {e.printStackTrace()} } 4. Register yourself

10 J0 10 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento CLIENT: CalendarUser import java.util.Date; import java.rmi.*; public class CalendarUser { public static void main(String args[]) { long t1=0,t2=0; Date date; iCalendar remoteCal; try { remoteCal = (iCalendar) Naming.lookup("rmi://HOST/CalendarImpl"); t1 = remoteCal.getDate().getTime(); t2 = remoteCal.getDate().getTime(); } catch (Exception e) {e.printStackTrace();} System.out.println("This RMI call took " + (t2-t1) + milliseconds ); } 6. Use Service

11 J0 11 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Preparing and executing SERVER C:dir CalendarImpl.java iCalendar.java C:javac CalendarImpl.java C:rmic CalendarImpl C:dir CalendarImpl.java iCalendar.java CalendarImpl.class iCalendar.class CalendarImpl_Stub.class CalendarImpl_Skel.class C:java CalendarImpl CLIENT C:dir CalendarUser.java iCalendar.java C:javac CalendarUser.java C:dir CalendarUser.java iCalendar.java CalendarImpl_Stub.class C:java CalendarUser copy

12 J0 12 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Preparing and executing NOTE: in Java 2 the skeleton may not exist (its functionality is absorbed by the class file). In order to use the Java 2 solution, one must specify the switch –v1.2 C:rmic –v1.2 CalendarImpl

13 J0 13 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Parameter passing Java Standard: void f(int x) : Parameter x is passed by copy void g(Object k) : Parameter k and return value are passed by reference Java RMI: void h(Object k) : Parameter k is passed by copy! UNLESS k is a REMOTE OBJECT (in which case it is passed as a REMOTE REFERENCE, i.e. its stub is copied if needed)

14 J0 14 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Alternativa 1 – accensione del registro Invece di scrivere nel codice del server LocateRegistry.createRegistry(1099); è possibile far partire a mano il registro da shell: C: rmiregistry 1099 (port number is optional) Nota: in Java 2 occorre un parametro addizionale: C: rmiregistry –J-Djava.security.policy=registerit.policy dove registerit.policy è un file contenente: grant {permission java.security.AllPermission} o una restrizione dei permessi. Il file è in genere in %USER_HOME%/.java.policy

15 J0 15 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Alternativa 2 – caricamento dinamico dello stub Invece di dover copiare a mano lo stub dal Server al client, si puo caricare lo stub automaticamente a runtime?

16 J0 16 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento This client expects a URL in the marshalling stream for the remote object. It will load the stub class for the remote object from the URL in the marshalling stream. Before you can load classes from a non-local source, you need to set a security manager. Note, as an alternative to using the RMISecurityManager, you can create your ownsecurity manager. import java.util.Date; import java.rmi.*; public class CalendarUser { public static void main(String args[]) { long t1=0,t2=0; Date date; iCalendar remoteCal; System.setSecurityManager(new RMISecurityManager()); try { remoteCal = (iCalendar) Naming.lookup("rmi:/HOST//CalendarImpl"); t1 = remoteCal.getDate().getTime(); t2 = remoteCal.getDate().getTime(); } catch (Exception e) {e.printStackTrace();} System.out.println("This RMI call took " + (t2-t1) + milliseconds ); } CLIENT: CalendarUser - Caric.dinamic o

17 J0 17 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento SERVER: CalendarImpl – Caricamento dinamico import java.util.Date; import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; public class CalendarImpl extends UnicastRemoteObject implements iCalendar { public CalendarImpl() throws RemoteException {} public Date getDate () throws RemoteException { return new Date(); } public static void main(String args[]) { CalendarImpl cal; System.setSecurityManager(new RMISecurityManager()); System.getProperties().put( "java.rmi.server.codebase", "http://HOST/java/classes/"); try { LocateRegistry.createRegistry(1099); cal = new CalendarImpl(); Naming.bind("rmi:///CalendarImpl", cal); System.out.println("Ready for RMI's"); } catch (Exception e) {e.printStackTrace()} } La prima parte resta invariata

18 J0 18 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Caricamento dinamico (in locale) di una classe remota Diverso paradigma: caricare a runtime una classe residente su una macchina remota, crearne una istanza locale ed eseguirla.

19 J0 19 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento Caricamento dinamico di una classe remota Object 1 Class 2 1. Get class Client Host Server Host Class 2 Object 2 2. Create instance 3. Invoke method

20 J0 20 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento La classe remota caricabile dinamicamente import java.awt.*; public class NetworkApp implements Executable { Frame f; public NetworkApp(Frame f) { this.f = f; }; public void exec() { Label l = new Label("Latest version of your application.", Label.CENTER); f.add("Center",l); f.pack(); f.repaint(); } public interface Executable { public void exec(); }

21 J0 21 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento import java.awt.*; import java.awt.event.*; import java.net.URL; import java.rmi.RMISecurityManager; import java.rmi.server.RMIClassLoader; import java.lang.reflect.*; public class ExecutableLoader { public static void main(String args[]) { System.setSecurityManager(new RMISecurityManager() { public void checkPermission(Permission p){} });; Frame cf = new Frame("NetworkApp"); cf.show(); try { URL url = new URL("http://HOST/java/NetworkApp/"); Class cl = RMIClassLoader.loadClass(url,"NetworkApp"); Class argTypes[] = {Class.forName("java.awt.Frame")}; Object argArray[] = {cf}; Constructor cntr = cl.getConstructor(argTypes); Executable client = (Executable)cntr.newInstance(argArray); client.exec(); } catch (Exception e) {e.printStackTrace();} } Caricatore dinamico


Download ppt "J0 1 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialistica in Informatica – Università di Trento."

Similar presentations


Ads by Google