Download Java RMI Remote Method Invocation Invocación Remota de
Document related concepts
no text concepts found
Transcript
Java RMI
Remote Method Invocation
Invocación Remota de Métodos
en Java
Contenido
Introducción
Implementación
Diseño de la interfaz remota.
Implementación de la interfaz remota.
Obtención de las clases Stub y Skeleton.
Aplicación del Servidor.
Aplicación del Cliente.
Ejecución
Registro de objetos remotos
Iniciar el Servidor
Establecer la política de seguridad
Iniciar el Cliente.
Universidad de Huelva
I.T. Informática
Programación Concurrente
Introducción
Programación Distribuida
Modelo cliente-servidor
Servidor
Cliente
Cliente
Universidad de Huelva
I.T. Informática
Programación Concurrente
Introducción
Arquitectura RMI
Cliente
Capa de Aplicación
Servidor
Stub
Capa Proxy
Skeleton
Capa de Referencia Remota
Capa de Transporte
Universidad de Huelva
I.T. Informática
Programación Concurrente
Introducción
Arquitectura RMI
Cliente
Servidor
Interface Remota
Stub
Implementación
Interface Remota
Aplicación
Cliente
Skeleton
Aplicación
Servidor
Registra Objetos
Universidad de Huelva
I.T. Informática
Programación Concurrente
Introducción
Pasos para el desarrollo de aplicaciones
Implementación
Diseño y compilación de la interfaz remota.
Implementación de la interface remota en una clase y su compilación.
Obtención de las clases Stub y Skeleton a partir de la interface remota.
Desarrollo y Compilación de la Aplicación del Servidor.
Desarrollo y Compilación de la Aplicación del Cliente.
Ejecución
Registro de objetos remotos
Iniciar el Servidor
Establecer la política de seguridad
Iniciar el Cliente.
Durante la explicación realizaremos un ejemplo tipo “Hola, Mundo!”.
Universidad de Huelva
I.T. Informática
Programación Concurrente
Implementación
Diseño de la Interface Remota
import java.rmi.*;
public interface <nombInterfaceRemota> extends Remote {
// prototipos de los métodos remotos que deben lanzar
// la excepción RemoteException.
}
Compilación
javac <nombInterfaceRemota>.java
Æ
<nombInterfaceRemota>.class
Interface de nuestro ejemplo: IntSaludo.java
import java.rmi.*;
public interface IntSaludo extends Remote {
// Un método remoto que recibe y devuelve una cadena
String saludo(String soy) throws RemoteException;
}
Universidad de Huelva
I.T. Informática
Programación Concurrente
Implementación
Implementación 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 métodos remotos de la Interface.
}
Compilación
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. Informática
Programación Concurrente
Implementación
Las clases Stub y Skeleton // ojo sólo 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>
Æ
Crear un fichero .jar con las clases
jar cvf <ficheroClass>.jar *.class Æ
nombClase_Stub.class
nombClase_Skel.class
<ficheroClass>.jar
$ InterfaceRemota.class
nombClase.class
nombClase_Stub.class
nombClase_Skel.class
En nuestro Ejemplo
Universidad de Huelva
jar cvf *.class saludo.jar Æ
I.T. Informática
saludo.jar
Programación Concurrente
Implementación
La aplicación 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();
}
…
}
Compilación: javac <apServidor>.java
Universidad de Huelva
I.T. Informática
Æ
<apServidor>.class
Programación Concurrente
Implementación
La aplicación 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. Informática
Programación Concurrente
Implementación
La aplicación del Cliente
import java.rmi.*;
public class <apCliente> {
…
// Obtener la referencia del objeto remoto y convertirla al tipo interface remota
// invocar métodos remotos
try {
obj = (<InterfaceRemota>) Naming.lookup(“<url>/<objRemoto>");
obj.metodoRemoto();
} catch (Exception e) {
System.out.println("Excepcion: " + e.getMessage());
e.printStackTrace();
}
…
}
Compilación: javac <apCliente>.java
Universidad de Huelva
I.T. Informática
Æ
<apCliente>.class
Programación Concurrente
Implementación
La aplicación 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 métodos 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. Informática
Programación Concurrente
Pasos previos a la ejecución
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. Informática
Programación Concurrente
Ejecución
Iniciar el registro de objetos: rmiregistry (Nota: es posible establecer un puerto específico)
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 política de seguridad
java -Djava.rmi.server.codebase=file:/c:\ejRMI\<ficheroClass>.jar
-Djava.security.policy=<java.policy> <apServidor>
Fichero para la política 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 sólo esta línea:
grant { permission java.security.AllPermission; };
Iniciar el Cliente:
Universidad de Huelva
java <apCliente>
I.T. Informática
Programación Concurrente
Ejecución de nuestro ejemplo
Registrar Objetos:
Iniciar Servidor: (supongase que el directorio de trabajo es c:\rmiEj3)
start rmiregistry
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. Informática
Programación 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. Informática
Programación Concurrente
Productor - Consumidor
Implementación 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. Informática
Programación 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. Informática
Programación 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. Informática
Programación Concurrente
Java RMI
Invocación Remota de Métodos