Sunteți pe pagina 1din 10

Realizado por: RMI (Remote Method Invocation)

Sistemas Distribuidos

Carlos Sigua Paola Pintado

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.

RMI (Remote Method Invocation)

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

Figura 1 Vista simple del funcionamiento RMI

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.

Arquitectura En RMI su arquitectura se compone de cuatro capas.

Figura 2 Vista de las capas de RMI

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

RMI (Remote Method Invocation)

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.

Pasos para tener una Aplicacin RMI


En este mbito se tocara un ejemplo utilizando la misma mquina como Cliente y como Servidor 1. Paso 1 Definir la interfaz remota
/* SampleServer.java */ import java.rmi.*; public interface SampleServer extends Remote { public int sum(int a,int b) throws RemoteException; }

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(); }

Implementar el metodo remoto


/* SampleServerImpl.java */ public int sum(int a,int b) throws RemoteException { return a + b; } }

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);

RMI (Remote Method Invocation)

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

6. Paso 6 Iniciar el RMI registry


c:~/rmi> rmiregistry

RMI (Remote Method Invocation)

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

Explicacin de la aplicacin RMI elegida.


Para esto usamos el IDE Eclipse Juno y el JDK 7 de Java en Windows. Esta aplicacin recibe la solicitud del Cliente del mtodo remoto saludar(String nombre), el servidor procesa la solicitud y simplemente la ejecuta. Con el propsito de que sea funcional rpidamente se ha decidido usar la misma maquina como servidor y cliente. En el servidor como se explica en el ejemplo prototipo hay unos pasos que vamos a cumplirlos de la misma manera: Antes de todo creamos un proyecto Java que va a contener a las clases tanto del Cliente como del Servidor. 1. Definir la interfaz remota en el Cliente
InterfazRMI_enelCliente.java
import java.rmi.Remote; import java.rmi.RemoteException; public interface InterfazRMI_enelCliente extends Remote{ //Declaro el metodo que va a ser llamado desde el Cliente Remoto public String saludar(String nombre) throws RemoteException; }

2. Implementar los mtodos de la interfaz declarados en el Cliente.


ImplementacionRMI_enelServidor.java
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class ImplementacionRMI_enelServidor extends UnicastRemoteObject implements InterfazRMI_enelCliente { public ImplementacionRMI_enelServidor() throws RemoteException{ super(); } /** * IMPLEMENTACION DEL METODO REMOTO */ @Override public String saludar(String nombre) throws RemoteException{ // TODO Auto-generated method stub System.out.print("Respuesta del servidor"); return "Hola "+nombre + "que mas ao como te va"; }

RMI (Remote Method Invocation)

Sistemas Distribuidos

3. Desarrollar el programa cliente y el programa Servidor


Cliente.java
import java.io.InputStreamReader; import java.rmi.Naming; import java.util.Scanner; public class Cliente { /** * @param args */ public static void main(String[] args) { try { // TODO Auto-generated method stub InterfazRMI_enelCliente i = (InterfazRMI_enelCliente) Naming.lookup("rmi://localhost//saludo"); String nombre; Scanner sc = new Scanner(new InputStreamReader(System.in)); System.out.println("Como te llamas mi amigo"); nombre = sc.next(); System.out.println(i.saludar(nombre)); sc.close(); } catch (Exception e) { // TODO: handle exception } } }

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(); } }

4. Compilar los archivos .java

RMI (Remote Method Invocation)

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

Revisar si se ha creado el archivo requerido revisamos la carpeta, el archivo Stub

RMI (Remote Method Invocation)

Sistemas Distribuidos

6. Iniciar el RMIregistry

7. Iniciar el servidor de objetos remotos

8. Correr el Cliente

RMI (Remote Method Invocation)

Sistemas Distribuidos

9. Visualizando la respuesta del servidor

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:

RMI (Remote Method Invocation)

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.

S-ar putea să vă placă și