Documente Academic
Documente Profesional
Documente Cultură
Sistemas Distribuidos
2013 - 2013
CLSM
OBJETIVOS
Explicar que significa RMI. Conseguir un ejemplo de RMI funcional y describir su funcionamiento
INTRODUCCION
Dentro de los mecanismos de comunicacin de procesos de alto nivel, est RMI un mecanismo implementado por Java para llamar a mtodos remotos, todo esto est dentro del contexto RPC (Remote Protocol Call). RMI es un mecanismo RPC y su objetivo principal es dar soporte a sistemas orientados a objetos al igual que CORBA. Pero hay diferencias 1. CORBA es un standard abierto independiente del lenguaje usado. 2. CORBA incluye muchos otros mecanismos dentro de s mismo ninguno de los cuales es parte de Java RMI. 3. En RMI no existe nocin del agente de peticin de objetos como lo hay en CORBA.
DESARROLLO
RMI (Invocacin de Mtodos Remotos)
Es un mecanismo de comunicacin para Sistemas Distribuidos, pero que trabaja solo sobre aplicaciones Java. Prescinde de la programacin que si toman en cuenta los sockets en el contexto de conexin, es decir libera al programador de la tediosa tarea de ocuparse tambin de las conexiones.
Es un mecanismo que ofrece Java para llamar a Mtodos de manera remota. RMI solo permite comunicacin entre tecnologa Java, si se desea comunicacin entre aplicaciones distintas debera utilizarse CORBA u otros.
Sistemas Distribuidos
Caractersticas Elimina la necesidad de serializacin y deserializacin de los datos enviados a travs de sockets, ya que esta tarea ya no la hace el programador. El cdigo fundamental de sockets todava existe, pero no es programado por el usuario
Los objetos remotos son tratados como objetos locales Mantiene serializado, transporte y recoleccin de basura de objetos remotos. Llega a ser parte del JDK version1.1 y posteriores. No tiene independencia de lenguaje, como en CORBA, ya que solo es usado en Java. Puede proveer ms componentes avanzados como serializacin y seguridad.
APLICACIN
STUB/SKELETON
REFERENCIA REMOTA
Implementacin de las aplicaciones del cliente y el servidor Llamadas de alto nivel para acceder y exportar objetos La aplicacin Cliente que desee que sus mtodos estn disponibles, declara estos mtodos en una interfaz que extienda de Remote en el Cliente del paquete java.rmi. La aplicacin Server que quiere implementar estos mtodos, implementa estos mtodos en una clase que extiende de UnicastRemoteObject del paquete java.rmi.server e e implementa la interfaz del cliente. Interacta con la capa de aplicacin Es en donde tiene lugar, la llamada de objetos remotos y su respectivo retorno junto con sus parmetros. Responsable del manejo de la persistencia de los objetos remotos. Maneja la comunicacin en medio del cliente-servidor en JVMs
Sistemas Distribuidos
TRANSPORTE
Capa de comunicacin que es usada para enviar informacin entre el cliente y el servidor a travs de un cable. Actualmente est basada en TCP-IP. Inicialmente intenta establecer una conexin socket ordinaria en medio del Cliente y el Servidor. Si lo anterior falla, intenta con HTTP Finalmente tratara de usar un cgi-script sobre el servidor y enviar los datos.
2. Paso 2 Desarrollar el objeto remoto para la implementacin de la interfaz remota. Crear el servidor remoto extendiendo de java.rmi.server.UnicastRemotObject El servidor usa el RMISecurityManager para proteger sus recursos mientras se acopla dentro de la comunicacin remota.
/* SampleServerImpl.java */ import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; public class SampleServerImpl extends UnicastRemoteObject implements SampleServer { SampleServerImpl() throws RemoteException { super(); }
El servidor deberia enlazar su nombre para el registro, el cliente buscara el nombre del servidor. Use java.rmi.Naming class para enlazar el nombre del servidor al registro. En este ejemplo el nombre se llama SIMPLE-SERVER En el metodo main de tu objeto servidor, RMISecurityManager es creado e instalado
/* SampleServerImpl.java */ public static void main(String args[]) { try { //create a local instance of the object SampleServerImpl Server = new SampleServerImpl(); //put the local instance in the registry Naming.rebind("SAMPLE-SERVER" , Server);
Sistemas Distribuidos
System.out.println("Server waiting....."); } catch (java.net.MalformedURLException me) { System.out.println("Malformed URL: " + me.toString()); } catch (RemoteException re) { System.out.println("Remote exception: " + re.toString()); }
3. Paso 3 Desarrollar el programa Cliente El cliente primero debera buscar el nombre del servidor en el registro, para esto se usar java.rmi.Naming para buscar el nombre del servidor. El nombre del servidor es especificado como una URL dentro del siguiente marco (rmi://host:port//nombreServicio) Donde: Si se omite el nombre del host RMI asume que es el local host. Si se omite el nmero del puerto RMI asume que es el puerto por defecto para estas comunicaciones, el puerto 1099. La invocacin al mtodo remoto es programado usando el nombre de la interfaz remota(Remote Object) y el nombre del mtodo remoto(sum) como subfijo.
import java.rmi.*; import java.rmi.server.*; public class SampleClient { public static void main(String[] args) { //get the remote object from the registry try { System.out.println("Security Manager loaded"); String url = "//localhost/SAMPLE-SERVER"; SampleServer remoteObject = (SampleServer)Naming.lookup(url); System.out.println("Got remote object"); System.out.println(" 1 + 2 = " + remoteObject.sum(1,2) ); } catch (RemoteException exc) { System.out.println("Error in lookup: " + exc.toString()); } catch (java.net.MalformedURLException exc) { System.out.println("Malformed URL: " + exc.toString()); } catch (java.rmi.NotBoundException exc) { System.out.println("NotBound: " + exc.toString()); } } } }
4. Paso 4 Compilar los archivos de cdigo fuente Java 5. Paso 5 Generar el stub del cliente y el skeleton del servidor. El paso 4 est incluido junto con el paso 5. Primero en Windows abrimos una terminal DOS Luego nos situamos en los directorios donde estn nuestros archivos .java
c:~/rmi> c:~/rmi> c:~/rmi> c:~/rmi> c:~/rmi> } set CLASSPATH=~/rmi javac SampleServer.java javac SampleServerImpl.java rmic SampleServerImpl javac SampleClient.java
Sistemas Distribuidos
7. Paso 7 Iniciar el servidor de objetos remotos 8. Paso 8 Correr el Cliente Aqu est incluido el paso 7
c:~/rmi> java SampleServerImpl c:~/rmi> java SampleClient
Nota: lo anterior describe un ejemplo funcional pero no es el que se implement para esta practica
Sistemas Distribuidos
Servidor.java
import java.rmi.Naming; public class Servidor { /** * @param args */ public Servidor(){ try { // Aqui le decimos al servidor que le escuche al cliente InterfazRMI_enelCliente interfaz = new ImplementacionRMI_enelServidor(); Naming.rebind("rmi://localhost//saludo", interfaz); } catch (Exception e) { // TODO: handle exception } } public static void main(String[] args) { new Servidor(); Servidor server = new Servidor(); } }
Sistemas Distribuidos
Bueno en este caso Eclipse ya lo hace por nosotros y solo tenemos que situarnos a travs de cmd en la carpeta bin del proyecto Eclipse
5. Generar el Stub del Cliente y el Skeleton del Servidor Para este caso solo hay que poner el siguiente comando
Sistemas Distribuidos
6. Iniciar el RMIregistry
8. Correr el Cliente
Sistemas Distribuidos
CONCLUSIONES RMI es medio de comunicacin de procesos, fcil de usar, hay mucha documentacin y es una buena alternativa si solo se quiere usar la tecnologa java, para implementar un sistema distribuido.
Bibliografa
[1] A. Siegel, people.cs.chicago.edu, [En lnea]. Available: http://people.cs.uchicago.edu/~asiegel/courses/cspp51037/RMI.ppt. [ltimo acceso: Lunes 29 Abril 2013]. [2] C. Department, http://www.eng.auburn.edu, [En lnea]. Available:
Sistemas Distribuidos
http://www.eng.auburn.edu/center/irsc/comp0690/rmi.ppt. [ltimo acceso: 29 Abril 2013]. [3] Wikipedia, http://es.wikipedia.org, [En lnea]. Available: http://es.wikipedia.org/wiki/Java_Remote_Method_Invocation. [ltimo acceso: 29 Abril 2013]. [4] Oracle, http://docs.oracle.com, [En lnea]. Available: http://docs.oracle.com/javase/tutorial/rmi/overview.html. [ltimo acceso: 29 Abril 2013]. [5] B. University, http://www.eg.bucknell.edu/~cs379/, [En lnea]. Available: http://www.eg.bucknell.edu/~cs379/DistributedSystems/rmi_tut.html. [6] Oracle, http://docs.oracle.com/javase/6/docs/api/java/rmi, [En lnea]. Available: http://docs.oracle.com/javase/6/docs/api/java/rmi/Naming.html. [ltimo acceso: 29 Abril 2013]. [7] [En lnea]. Available: http://www.daniweb.com/softwaredevelopment/java/threads/43866/ftp-client-server-using-rmi. [8] [En lnea]. Available: http://www-gti.det.uvigo.es/~pedro/pub/lsodtr/boletinli3.html. [9] [En lnea]. Available: http://www.javacamp.org/moreclasses/rmi/rmi4.html. [10] [En lnea]. Available: http://www.java2all.com/1/5/22/114/Technology/RMI/RMIProgram/RMI-example.