4/22/2008 Comunicación entre Procesos Objetos Remotos Objetos Distribuidos Estado: encapsula los datos z Métodos: operaciones sobre los datos z Interface: se utiliza I t f tili para la l disponibilidad de los métodos z 1 4/22/2008 Objetos Remotos Objetos Distribuidos Objetos Remotos Tipos de Objetos z Compile-Time: dependientes del lenguaje de programación z Runtime: independientes del lenguaje de programación z Object adapter 2 4/22/2008 Objetos Remotos Tipos de Objetos z Persistentes: perduran en el tiempo. No depende del proceso servidor z Transitorios: perdura mientras esté activo el proceso servidor. Objetos Remotos Binding un Cliente a un Objeto (A) Un ejemplo con binding implícito utilizando solamente referencias globales. Distr_object* obj_ref; //Declaración de una referencia a un // objeto del sistema (systemwide) obj_ref obj ref = …;; // // // // obj_ref-> do_something(); Inicialización de la referencia al objeto ditribuido Bind implícito e invocación a un métdodos. 3 4/22/2008 Objetos Remotos g un Cliente a un Objeto j Binding (B) Un ejemplo con binding explícito utilizando referencias globales y locales. Distr_object objPref; Local_object* obj_ptr; obj_ref = …; obj_ptr = bind(obj_ref); obj_ptr -> do_something(); //Declaración de una referencia a un //objeto del sistema (systemwide) //Declaración de un puntero a un //objeto local //Inicialización de la referencia al //objeto distribuido. //Bind explícito y obtención de un // puntero al proxy local. //Invocación de un método en el proxy // local. Objetos Remotos Referencia a un Objeto j Dirección de red de la máquina, dirección de Internet z Identificación del servidor (puerto) z Tiempo z Identificación del objeto z Interface del Objeto Remoto z 4 4/22/2008 Objetos Remotos j Referencia a un Objeto 32 bits Dir Internet 32 bits Nro. puerto 32 bits 32 bits tiempo Nro.objeto interface del Objeto remoto Objetos Remotos Forma de Invocación z z Estática Dinámica p. ej Fobjeto.append(int) Invoke(objeto, método, param entrada, param salida) Invoke(fobjeto, id(append), int) 5 4/22/2008 Objetos Remotos Pasaje de Parámetros RMI Invocación de Métodos Locales y Remotos invocación remota A B local C E invocación local invocación local invocación D remota invocación F 6 4/22/2008 RMI Objeto Remoto e Interfaces objeto remoto remota interface { Datos m1 m2 m3 implementación De métodos m4 m5 m6 RMI Arquitectura y Componentes servidor cliente objeto A proxy de B Request remoto skeleton objeto B & dispatcher Para clase B’s Reply módulo de Remote Comunicación reference módulo módulo de Comunicación Remote reference módulo 7 4/22/2008 RMI Java RMI • Java Remote Method Invocation (Java RMI) permite crear aplicaciones distribuidas utilizando la tecnología basada en Java, permitiendo que los métodos de objetos remotos puedan ser invocados desde otra máquina virtual Java, ubicada posiblemente en otro nodo. • RMI utiliza serialización de objetos para realizar el marshal y parámetros y no truncar tipos, p , soportando p unmarshal de los p el polimorfismo de la orientación a objetos. • Releases de Java RMI – Java RMI está disponible para la Plataforma Java 2, Standard Edition (J2SE) y la Plataforma Java 2, Micro Edition (J2ME). RMI Java RMI z Pasos para realizar una aplicación distribuida 1. 2. 3. 4. Diseñar la interface remota Diseñar el programa servidor Diseñar el programa cliente Compilar los fuente y generar los stubs 8 4/22/2008 RMI j p Java RMI - Ejemplo 1.‐ Diseñar la Interface Remota ReceiveMessageInterface.java import java.rmi.*; public interface ReceiveMessageInterface extends Remote { void receiveMessage(String x) throws RemoteException; } RMI Java RMI - Ejemplo 2 Diseñar el programa servidor 2.‐ Diseñar el programa servidor RmiServer.java import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; import java.net.*; public class RmiServer extends java.rmi.server.UnicastRemoteObject implements ReceiveMessageInterface { int thisPort;; String thisAddress; Registry registry; // rmi registry for lookup the remote objects. // This method is called from the remote client by the RMI. // This is the implementation of the “ReceiveMessageInterface”. public void receiveMessage(String x) throws RemoteException { System.out.println(x); } 9 4/22/2008 RMI public RmiServer() throws RemoteException { try{ // get the address of this host. thisAddress= (InetAddress.getLocalHost()).toString(); } catch(Exception e){ throw new RemoteException("can't get inet address."); } thisPort=3232; // this port(registry’s port) System.out.println("this address="+thisAddress+",port="+thisPort); t { try{ // create the registry and bind the name and object. registry = LocateRegistry.createRegistry( thisPort ); registry.rebind("rmiServer", this); } catch(RemoteException e){ throw e; } } RMI static public void main(String args[]) { try{ RmiServer s=new RmiServer(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } } 10 4/22/2008 RMI Java RMI - Ejemplo 3.‐ Diseñar el programa cliente RmiClient.java import java.rmi.*; import java.rmi.registry.*; import java.net.*; public class RmiClient { static public void main(String args[]) { ReceiveMessageInterface rmiServer; Registry registry; String serverAddress=args[0]; String serverPort=args[1]; String text=args[2]; System.out.println("sending "+text+" to "+serverAddress+":"+serverPort); RMI try{ } // get the “registry” registry=LocateRegistry.getRegistry(serverAddress, (new Integer(serverPort)).intValue() ); // look up the remote object rmiServer= (ReceiveMessageInterface)(registry.lookup("rmiServer")); // call the remote method rmiServer.receiveMessage(text); } catch(RemoteException e){ e.printStackTrace(); } catch(NotBoundException e){ e.printStackTrace(); } } 11 4/22/2008 RMI Java RMI - Ejemplo 4.‐ Compilar los fuentes y generar los stubs z z z javac RmiServer.java ReceiveMessageInferface.java javac RmiClient.java ReceiveMessageInterface.java rmic –classpath . RmiServer RmiServer_Skel.class RmiServer_Stub.class 12