Sunteți pe pagina 1din 21

Java RMI Remote Method Invocation

Invocacin Remota de Mtodos en Java

Contenido

Introduccin Implementacin

Diseo de la interfaz remota. Implementacin de la interfaz remota. Obtencin de las clases Stub y Skeleton. Aplicacin del Servidor. Aplicacin del Cliente.

Ejecucin
Registro de objetos remotos Iniciar el Servidor

Establecer la poltica de seguridad

Iniciar el Cliente.

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Introduccin

Programacin Distribuida Modelo cliente-servidor


Servidor

Cliente

Cliente

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Introduccin

Arquitectura RMI Cliente Capa de Aplicacin Servidor

Stub

Capa Proxy

Skeleton

Capa de Referencia Remota

Capa de Transporte

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Introduccin

Arquitectura RMI Cliente Servidor Interface Remota Stub Implementacin Interface Remota Aplicacin Servidor

Aplicacin Cliente

Skeleton

Registra Objetos

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Introduccin

Pasos para el desarrollo de aplicaciones

Implementacin Diseo y compilacin de la interfaz remota. Implementacin de la interface remota en una clase y su compilacin. Obtencin de las clases Stub y Skeleton a partir de la interface remota. Desarrollo y Compilacin de la Aplicacin del Servidor. Desarrollo y Compilacin de la Aplicacin del Cliente. Ejecucin Registro de objetos remotos Iniciar el Servidor Establecer la poltica de seguridad Iniciar el Cliente. Durante la explicacin realizaremos un ejemplo tipo Hola, Mundo!.
I.T. Informtica Programacin Concurrente

Universidad de Huelva

Implementacin

Diseo de la Interface Remota


import java.rmi.*; public interface <nombInterfaceRemota> extends Remote { // prototipos de los mtodos remotos que deben lanzar // la excepcin RemoteException. }

Compilacin
javac <nombInterfaceRemota>.java <nombInterfaceRemota>.class

Interface de nuestro ejemplo: IntSaludo.java


import java.rmi.*; public interface IntSaludo extends Remote { // Un mtodo remoto que recibe y devuelve una cadena String saludo(String soy) throws RemoteException; }

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Implementacin

Implementacin de la interface remota


import java.rmi.*; import java.rmi.server.*; class <nombClase> extends UnicastRemoteObject implements IntSaludo { // El constructor debe invocar al constructor de UnicastRemoteObject: super(); // Se deben implementar los mtodos remotos de la Interface. }

Compilacin
javac <nombClase>.java <nombClase>.class

En nuestro ejemplo: ClsSaludo.java


import java.rmi.*; import java.rmi.server.*; class ClsSaludo extends UnicastRemoteObject implements IntSaludo { public ClsSaludo() throws RemoteException { super(); } public String saludo(String soy) throws RemoteException { return Hola +soy; } }

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Implementacin

Las clases Stub y Skeleton // ojo slo versiones anteriores a jdk 1.5

Las clases Stub y Skeleton son obtenidas a partir de la clase anterior. Compilador de Java RMI: rmic rmic <nombClase>

nombClase_Stub.class nombClase_Skel.class <ficheroClass>.jar

Crear un fichero .jar con las clases jar cvf <ficheroClass>.jar *.class

$ InterfaceRemota.class
nombClase.class nombClase_Stub.class nombClase_Skel.class

En nuestro Ejemplo

jar cvf *.class saludo.jar

saludo.jar

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Implementacin

La aplicacin del servidor


import java.rmi.*; public class <apServidor> {

// Establecer el gestor de seguridad System.setSecurityManager(new RMISecurityManager()); // Instancias de Objetos Remotos // Registros de Objetos Remotos try { nombClase <objRemoto> = new nombClase(); Naming.rebind(<url>\<nomObj>, <objRemoto>); } catch (Exception ex) { System.err.println(Error: " + ex.getMessage()); e.printStackTrace(); }

Compilacin: javac <apServidor>.java


I.T. Informtica

<apServidor>.class
Programacin Concurrente

Universidad de Huelva

Implementacin

La aplicacin del servidor de nuestro Ejemplo


import java.rmi.*; public class apServidor { public static void main(String arg[]) { // Establecer el gestor de seguridad System.setSecurityManager(new RMISecurityManager()); // Instancias de Objetos Remotos // Registros de Objetos Remotos try { ClsSaludo objRemoto = new ClsSaludo(); Naming.rebind("//localhost/nomObj", objRemoto); System.out.println("Objeto Registrado"); } catch (Exception ex) { System.err.println("Error: " + ex.getMessage()); ex.printStackTrace(); } } }

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Implementacin

La aplicacin del Cliente


import java.rmi.*; public class <apCliente> { // Obtener la referencia del objeto remoto y convertirla al tipo interface remota // invocar mtodos remotos try { obj = (<InterfaceRemota>) Naming.lookup(<url>/<objRemoto>"); obj.metodoRemoto(); } catch (Exception e) { System.out.println("Excepcion: " + e.getMessage()); e.printStackTrace(); } }

Compilacin: javac <apCliente>.java

<apCliente>.class

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Implementacin

La aplicacin del Cliente de nuestro ejemplo


import java.rmi.*; public class apCliente { public static void main(String arg[]) { // Obtener la referencia del objeto remoto y convertirla al tipo interface remota // invocar mtodos remotos try { IntSaludo obj = (IntSaludo) Naming.lookup("//localhost/nomObj"); System.out.println(obj.saludo("Jose Luis")); } catch (Exception e) { System.out.println("Excepcion: " + e.getMessage()); e.printStackTrace(); } } }

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Pasos previos a la ejecucin

El bin de java debe estar en el path:


c:\set path=c:\Archivo deProgramas\java\jdk1.5.0\bin

Deben compilarse los fuentes en el entorno o usando linea de comando:


javac *.java Producir un .class por cada clase fuente en el servidor y en el cliente (si son maquinas distintas)

El Classpath debe estar disponible donde se encuentren las clases en la maquina servidora y cliente (caso de que sean distintas)
c:\rmi>set CLASSPATH = . o set CLASSPATH = Directorio donde estan los .class En nuestro ejemplo set CLASS PATH = c:\rmi

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Ejecucin

Iniciar el registro de objetos: rmiregistry (Nota: es posible establecer un puerto especfico)


rmiregistry mejor start rmiregistry

Iniciar el servidor. (supongase que el directorio de trabajo es c:\ejRMI)


Especificar el fichero .jar que contiene las clases Establecer la poltica de seguridad

java -Djava.rmi.server.codebase=file:/c:\ejRMI\<ficheroClass>.jar -Djava.security.policy=<java.policy> <apServidor>

Fichero para la poltica de seguridad grant { permission java.net.SocketPermission "*:1024-65535", "connect,accept"; permission java.net.SocketPermission "*:80", "connect"; };

Si queremos permitir todo, el fichero puede ser slo esta lnea: grant { permission java.security.AllPermission; };

Iniciar el Cliente:

java <apCliente>
I.T. Informtica Programacin Concurrente

Universidad de Huelva

Ejecucin de nuestro ejemplo

Registrar Objetos:

start rmiregistry

Iniciar Servidor: (supongase que el directorio de trabajo es c:\rmiEj3)


java -Djava.rmi.server.codebase=file:/c:\rmiEj3\saludo.jar -Djava.security.policy=java.policy apServidor

Iniciar Cliente
java apCliente

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Productor - Consumidor

Interface Remota
public interface IBuffer extends java.rmi.Remote { void poner(int num) throws java.rmi.RemoteException; int coger() throws java.rmi.RemoteException; }

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Productor - Consumidor

Implementacin Interface Remota


class CBuffer extends UnicastRemoteObject implements IBuffer { private int almacen[]=new int[4]; private int ent, sal, cont; public CBuffer() throws RemoteException { super(); ent=sal=cont=0; } public synchronized void poner(int n) throws RemoteException { while (cont==4) try { wait(); } catch(InterruptedException e) {} almacen[ent]=n; ent = (ent + 1) % 4;cont++; notify(); } public synchronized int coger() throws RemoteException { while (cont==0) try { wait(); } catch(InterruptedException e) {} int o = almacen[sal]; sal = (sal + 1) % 4;cont--; notify(); return o; }

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Productor - Consumidor

Cliente productor
import java.rmi.*; class CProductor { IBuffer obj; void producir() { try { obj = (IBuffer) Naming.lookup("//localhost/ObjBuffer"); } catch (Exception e) { System.out.println("Excepcion: " + e.getMessage()); } for(int i=1;i<=10;i++) { System.out.println("Quiero Escribir"); try { obj.poner(d); } catch (Exception e) { System.out.println("Excepcion: " + e.getMessage()); } System.out.println("Puesto: " + i); } } public static void main(String args[]) { CProductor c = new CProductor(); c.producir(); } }

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Productor - Consumidor

Cliente Consumidor
import java.rmi.*; class CConsumidor { IBuffer obj;int d; void consumir() { try { obj = (IBuffer)Naming.lookup("//localhost/ObjBuffer"); } catch (Exception e) { System.out.println("Excepcion: " + e.getMessage());} do { System.out.println("Quiero leer"); try { d = obj.coger(); } catch (Exception e) { System.out.println("Excepcion: " + e.getMessage()); } System.out.println("Leido: " + d); }while(d!=10); } public static void main(String args[]) { CConsumidor c = new CConsumidor(); c.consumir(); } }

Universidad de Huelva

I.T. Informtica

Programacin Concurrente

Java RMI

Invocacin Remota de Mtodos

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