Ejemplo Java Rmi

19
MEMORIA: MEMORIA: UN EJEMPLO SENCILLO UN EJEMPLO SENCILLO DE JAVA RMI EN DE JAVA RMI EN WINDOWS WINDOWS TECNO ACADEMY TECNO ACADEMY tecnoacademy.blogspot.com tecnoacademy.blogspot.com Salvador Fernández Salvador Fernández Fernández Fernández

description

Ejemplo sencillo de Java RMI explicado paso a paso para ejecutar sobre una única máquina Windows

Transcript of Ejemplo Java Rmi

Page 1: Ejemplo Java Rmi

MEMORIA:MEMORIA:

UN EJEMPLO SENCILLO UN EJEMPLO SENCILLO DE JAVA RMI EN DE JAVA RMI EN

WINDOWSWINDOWS

TECNO ACADEMYTECNO ACADEMYtecnoacademy.blogspot.comtecnoacademy.blogspot.com

Salvador Fernández Salvador Fernández FernándezFernández

Page 2: Ejemplo Java Rmi

EL EJEMPLOEL EJEMPLO

El proceso servidor provoca un eco El proceso servidor provoca un eco de la entrada de teclado enviada de la entrada de teclado enviada por el proceso cliente.por el proceso cliente.Por sencillez, ejecutaremos tanto el Por sencillez, ejecutaremos tanto el servidor como el cliente en la servidor como el cliente en la máquina localmáquina local..El sistema operativo es El sistema operativo es WindowsWindowsEl El jdkjdk utilizado es utilizado es 1.5.01.5.0

Page 3: Ejemplo Java Rmi

Código FuenteCódigo FuenteCreamos en Creamos en C:C:\\ una carpeta para ubicar el una carpeta para ubicar el código fuente del servidor. En mi caso, he código fuente del servidor. En mi caso, he creado una carpeta denominada creado una carpeta denominada rmi4rmi4

Para no mezclar el código del cliente, dentro de Para no mezclar el código del cliente, dentro de rmi4rmi4, creo una carpeta a la que llamo , creo una carpeta a la que llamo clientecliente..

Utilizaremos Utilizaremos dos ventanas de línea de dos ventanas de línea de comandoscomandos: una para las acciones sobre el : una para las acciones sobre el código de servidor y otra para las operaciones código de servidor y otra para las operaciones del cliente.del cliente.

Page 4: Ejemplo Java Rmi

Clases del servidorClases del servidor

Las ubicamos en la carpeta Las ubicamos en la carpeta c:c:\\rmi4rmi4

Son: Son: EcoRMI.javaEcoRMI.java (interfaz remota), (interfaz remota), EcoRMISirviente.javaEcoRMISirviente.java (implementación de (implementación de la interfaz remota) y la interfaz remota) y EcoRMIServidor.javaEcoRMIServidor.java(la aplicación remota)(la aplicación remota)

Page 5: Ejemplo Java Rmi

EcoRMI.javaEcoRMI.java

publicpublic interfaceinterface EcoRMIEcoRMI extendsextendsjava.rmi.Remotejava.rmi.Remote

{ { publicpublic StringString eco(Stringeco(String mensaje) mensaje)

throwsthrows java.rmi.RemoteExceptionjava.rmi.RemoteException;;} }

Page 6: Ejemplo Java Rmi

EcoRMISirviente.javaEcoRMISirviente.java (1/2)(1/2)importimport java.rmijava.rmi.*; .*; importimport java.rmi.server.UnicastRemoteObjectjava.rmi.server.UnicastRemoteObject; ;

publicpublic classclass EcoRMISirvienteEcoRMISirviente extendsextends UnicastRemoteObjectUnicastRemoteObjectimplementsimplements EcoRMIEcoRMI

{ { publicpublic EcoRMISirviente(StringEcoRMISirviente(String nombre) nombre) throwsthrows RemoteExceptionRemoteException{ { supersuper(); (); trytry{ { Naming.rebind(nombreNaming.rebind(nombre, , thisthis); );

} } catchcatch ((ExceptionException e) { e) { System.out.printlnSystem.out.println("("ExcepcionExcepcion: " + : " + e.getMessagee.getMessage()); ()); e.printStackTracee.printStackTrace(); ();

} } } }

Page 7: Ejemplo Java Rmi

publicpublic StringString eco(Stringeco(String mensaje) mensaje) throwsthrowsRemoteExceptionRemoteException

{ { System.out.printlnSystem.out.println("Recibido: " + mensaje); ("Recibido: " + mensaje); returnreturn mensaje; mensaje;

} } } }

EcoRMISirviente.javaEcoRMISirviente.java (2/2)(2/2)// Implementación del método remoto// Implementación del método remoto

Page 8: Ejemplo Java Rmi

importimport java.rmijava.rmi.*; .*; importimport java.rmi.serverjava.rmi.server.*; .*;

publicpublic classclass EcoRMIServidorEcoRMIServidor{ {

publicpublic staticstatic voidvoid main(Stringmain(String argsargs[]) []) { {

// Crea e instala el gestor de seguridad// Crea e instala el gestor de seguridadSystem.setSecurityManager(newSystem.setSecurityManager(new RMISecurityManagerRMISecurityManager()); ());

trytry{ {

EcoRMISirvienteEcoRMISirviente miEcomiEco = = newnewEcoRMISirvienteEcoRMISirviente("//:4000/mi("//:4000/mi--EcoRMIEcoRMI");");

System.out.printlnSystem.out.println("Servidor de ("Servidor de EcoRMIEcoRMI listo."); listo."); } } catchcatch ((ExceptionException e) { e) {

System.out.printlnSystem.out.println("("ExcepcionExcepcion: " + : " + e.getMessagee.getMessage()); ()); e.printStackTracee.printStackTrace(); ();

} } } }

}}

EcoRMIServidor.javaEcoRMIServidor.java

Page 9: Ejemplo Java Rmi

java.policyjava.policy

En En c:c:\\rmi4rmi4 (servidor) necesitamos un archivo de (servidor) necesitamos un archivo de política de seguridad política de seguridad java.policyjava.policy. Lo más simple . Lo más simple es habilitar todos los permisos. También lo es habilitar todos los permisos. También lo necesita el cliente; no obstante, basta con darle necesita el cliente; no obstante, basta con darle la ruta en el momento de ejecutarlo la ruta en el momento de ejecutarlo posteriormente.posteriormente.

grantgrant {{permissionpermission java.security.java.security.AllPermissionAllPermission;;

};};

Page 10: Ejemplo Java Rmi

Compilar en el servidorCompilar en el servidor

Desde la línea de comandos, Desde la línea de comandos, compilamos todas las clases en compilamos todas las clases en c:c:\\rmi4rmi4 (servidor):(servidor):

>>cdcd c:c:\\rmi4rmi4c:c:\\rmi4rmi4>>javacjavac *.java*.java

Page 11: Ejemplo Java Rmi

Generar Generar stubstub

En la misma línea de comandos, generamos el En la misma línea de comandos, generamos el archivo de archivo de stubstub::

c:c:\\rmi4rmi4>>rmicrmic EcoRMISirvienteEcoRMISirviente

Se genera un archivo llamado Se genera un archivo llamado EcoRMISirviente_stub.classEcoRMISirviente_stub.class. Es . Es importanteimportante, , acordarse de copiarlo en la carpeta cliente.acordarse de copiarlo en la carpeta cliente.

También debemos También debemos copiar en la carpeta clientecopiar en la carpeta clientelos archivos los archivos EcoRMI.javaEcoRMI.java y y EcoRMI.classEcoRMI.class

Page 12: Ejemplo Java Rmi

Clases en el clienteClases en el cliente

Además de los archivos Además de los archivos EcoRMISirviente.classEcoRMISirviente.class, , EcoRMI.javaEcoRMI.java y y EcoRMI.classEcoRMI.class que hemos copiado en que hemos copiado en pasos previos, debemos guardar en pasos previos, debemos guardar en c:c:\\rmi4rmi4\\clientecliente el código fuente del cliente el código fuente del cliente al que denominaremos al que denominaremos EcoRMICliente.javaEcoRMICliente.java

Page 13: Ejemplo Java Rmi

importimport java.iojava.io.*; .*; importimport java.rmijava.rmi.*; .*; importimport java.rmi.registryjava.rmi.registry.*; .*; importimport java.rmi.serverjava.rmi.server.*; .*;

publicpublic classclass EcoRMIClienteEcoRMICliente{ {

publicpublic staticstatic voidvoid main(Stringmain(String argsargs[]) [])

{ { StringString mensajeEnviadomensajeEnviado; ; StringString mensajeRecibidomensajeRecibido; ; DataInputStreamDataInputStream dataIndataIn = = newnew DataInputStream(System.inDataInputStream(System.in); ); BufferedReaderBufferedReader in = in =

newnew BufferedReader(newBufferedReader(new InputStreamReader(dataInInputStreamReader(dataIn)); ));

// Crea e instala el gestor de seguridad // Crea e instala el gestor de seguridad System.setSecurityManager(newSystem.setSecurityManager(new RMISecurityManagerRMISecurityManager()); ());

trytry {{

EcoRMICliente.javaEcoRMICliente.java (1/2)(1/2)

Page 14: Ejemplo Java Rmi

EcoRMIEcoRMI miEcomiEco = = ((EcoRMI)Naming.lookupEcoRMI)Naming.lookup("("rmirmi://" ://" + + argsargs[0] + ":4000/" + "mi[0] + ":4000/" + "mi--EcoRMIEcoRMI"); ");

// hace un bucle hasta el fin de la entrada// hace un bucle hasta el fin de la entradaSystem.out.printSystem.out.print("Eco> "); ("Eco> "); whilewhile ((((mensajeEnviadomensajeEnviado = = in.readLinein.readLine()) != ()) != nullnull) { ) { mensajeRecibidomensajeRecibido = = miEco.eco(mensajeEnviadomiEco.eco(mensajeEnviado););System.out.println(mensajeRecibidoSystem.out.println(mensajeRecibido); ); System.out.printSystem.out.print("Eco> "); ("Eco> ");

} } } } catch(Exceptioncatch(Exception e) { e) { System.err.printlnSystem.err.println("("ExcepcionExcepcion de Sistema: " + e); de Sistema: " + e);

} } System.exitSystem.exit(0); (0);

} } } }

EcoRMICliente.javaEcoRMICliente.java (2/2)(2/2)

Page 15: Ejemplo Java Rmi

Compilar el clienteCompilar el cliente

Desde una nueva línea de comandos, Desde una nueva línea de comandos, compilamos la clase cliente en compilamos la clase cliente en c:c:\\rmi4rmi4\\clientecliente::

>>cdcd c:c:\\rmi4rmi4\\clienteclientec:c:\\rmi4rmi4\\clientecliente>>javacjavac EcoRMICliente.javaEcoRMICliente.java

Page 16: Ejemplo Java Rmi

Lanzar el Lanzar el rmiregistryrmiregistry

Aprovechamos la línea de comandos en la que Aprovechamos la línea de comandos en la que compilamos las clases del servidor para lanzar compilamos las clases del servidor para lanzar el registro de RMI en el puerto 4000 (en mi el registro de RMI en el puerto 4000 (en mi caso, el puerto por defecto 1099 estaba caso, el puerto por defecto 1099 estaba ocupado y no lo podía usar). Es ocupado y no lo podía usar). Es importanteimportanteadvertir que ese es el puerto que he utilizado en advertir que ese es el puerto que he utilizado en el código de Servidor y del Cliente; si usaseis el código de Servidor y del Cliente; si usaseis otro deberíais cambiar también el código:otro deberíais cambiar también el código:

c:c:\\rmi4rmi4>>startstart rmiregistryrmiregistry 40004000

(Debe abrirse una ventana de línea de (Debe abrirse una ventana de línea de comandos vacía y permanecer abierta. Si se comandos vacía y permanecer abierta. Si se cierra es que algo va mal)cierra es que algo va mal)

Page 17: Ejemplo Java Rmi

Lanzar el servidorLanzar el servidor

Desde la misma línea de comandos en la Desde la misma línea de comandos en la que estoy ejecuto el servidor:que estoy ejecuto el servidor:

c:c:\\rmi4rmi4>>java java ––Djava.security.policyDjava.security.policy=file:///c:/rmi4/=file:///c:/rmi4/java.policyjava.policy EcoRMIServidorEcoRMIServidor

Page 18: Ejemplo Java Rmi

Lanzar el clienteLanzar el cliente

Desde la misma línea de comandos en la Desde la misma línea de comandos en la que compilé la clase del cliente, ejecuto el que compilé la clase del cliente, ejecuto el proceso cliente:proceso cliente:

c:c:\\rmi4rmi4\\clientecliente>>java java ––Djava.security.policyDjava.security.policy=file:///c:/rmi4/=file:///c:/rmi4/java.policyjava.policyEcoRMIClienteEcoRMICliente localhostlocalhost

Page 19: Ejemplo Java Rmi

La ejecuciónLa ejecuciónUna vez lanzados todos los procesos sólo hay Una vez lanzados todos los procesos sólo hay que escribir algo en el que escribir algo en el promptprompt de la ventana de de la ventana de comandos del cliente y observar cómo comandos del cliente y observar cómo efectivamente se produce el eco de lo escrito efectivamente se produce el eco de lo escrito en las dos ventanasen las dos ventanas

Cliente

Servidor