EL EJEMPLO
EL 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 local
máquina local
.
.
El sistema operativo es
El sistema operativo es
Windows
Windows
El
Código Fuente
Código Fuente
Creamos 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
rmi4
rmi4, 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 comandos
comandos: 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.
Clases del servidor
Clases del servidor
Las ubicamos en la carpeta
Las ubicamos en la carpeta
c:
c:
\
\
rmi4
rmi4
Son:
Son:
EcoRMI.java
EcoRMI.java
(interfaz remota),
(interfaz remota),
EcoRMISirviente.java
EcoRMISirviente.java
(implementación de
(implementación de
la interfaz remota) y
la interfaz remota) y
EcoRMIServidor.java
EcoRMIServidor.java
(la aplicación remota)
EcoRMI.java
EcoRMI.java
public
public interfaceinterface EcoRMIEcoRMI extendsextends java.rmi.Remote
java.rmi.Remote {
{
public
public StringString eco(Stringeco(String mensaje) mensaje) throws
throws java.rmi.RemoteExceptionjava.rmi.RemoteException;; }
EcoRMISirviente.java
EcoRMISirviente.java
(1/2)
(1/2)
import
import java.rmijava.rmi.*; .*; import
import java.rmi.server.UnicastRemoteObjectjava.rmi.server.UnicastRemoteObject; ;
public
public classclass EcoRMISirvienteEcoRMISirviente extendsextends UnicastRemoteObjectUnicastRemoteObject implements
implements EcoRMIEcoRMI {
{
public
public EcoRMISirviente(StringEcoRMISirviente(String nombre) nombre) throwsthrows RemoteExceptionRemoteException { { super super(); (); try try { { Naming.rebind(nombre
Naming.rebind(nombre, , thisthis); ); }
} catchcatch ((ExceptionException e) { e) { System.out.println
System.out.println("("ExcepcionExcepcion: " + : " + e.getMessagee.getMessage()); ()); e.printStackTrace e.printStackTrace(); (); } } } }
public
public StringString eco(Stringeco(String mensaje) mensaje) throwsthrows RemoteException
RemoteException {
{
System.out.println
System.out.println("Recibido: " + mensaje); ("Recibido: " + mensaje); return
return mensaje; mensaje; } } } }
EcoRMISirviente.java
EcoRMISirviente.java
(2/2)
(2/2)
// Implementación del método remoto
import
import java.rmijava.rmi.*; .*; import
import java.rmi.serverjava.rmi.server.*; .*; public
public classclass EcoRMIServidorEcoRMIServidor {
{
public
public staticstatic voidvoid main(Stringmain(String argsargs[]) []) {
{
// Crea e instala el gestor de seguridad
// Crea e instala el gestor de seguridad
System.setSecurityManager(new
System.setSecurityManager(new RMISecurityManagerRMISecurityManager()); ()); try
try
{
{
EcoRMISirviente
EcoRMISirviente miEcomiEco = = newnew EcoRMISirviente
EcoRMISirviente("//:4000/mi("//:4000/mi--EcoRMIEcoRMI");"); System.out.println
System.out.println("Servidor de ("Servidor de EcoRMIEcoRMI listo."); listo."); }
} catchcatch ((ExceptionException e) { e) { System.out.println
System.out.println("("ExcepcionExcepcion: " + : " + e.getMessagee.getMessage()); ()); e.printStackTrace e.printStackTrace(); (); } } } } } }
EcoRMIServidor.java
EcoRMIServidor.java
java.policy
java.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.
grant
grant {{
permission
permission java.security.java.security.AllPermissionAllPermission;; };
Compilar en el servidor
Compilar 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:
\
\
rmi4
rmi4
(servidor):
(servidor):
>>cdcd c:c:\\rmi4rmi4
Generar
Generar
stub
stub
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.class
EcoRMISirviente_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 cliente los archivos
Clases en el cliente
Clases en el cliente
Además de los archivos
Además de los archivos
EcoRMISirviente.class
EcoRMISirviente.class, , EcoRMI.javaEcoRMI.java y y EcoRMI.class
EcoRMI.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.java EcoRMICliente.java
import
import java.iojava.io.*; .*; import
import java.rmijava.rmi.*; .*; import
import java.rmi.registryjava.rmi.registry.*; .*; import
import java.rmi.serverjava.rmi.server.*; .*; public
public classclass EcoRMIClienteEcoRMICliente {
{
public
public staticstatic voidvoid main(Stringmain(String argsargs[]) []) {
{
String
String mensajeEnviadomensajeEnviado; ; String
String mensajeRecibidomensajeRecibido; ; DataInputStream
DataInputStream dataIndataIn = = newnew DataInputStream(System.inDataInputStream(System.in); ); BufferedReader
BufferedReader in = in = new
new BufferedReader(newBufferedReader(new InputStreamReader(dataInInputStreamReader(dataIn)); )); // Crea e instala el gestor de seguridad
// Crea e instala el gestor de seguridad
System.setSecurityManager(new
System.setSecurityManager(new RMISecurityManagerRMISecurityManager()); ()); try
try {{
EcoRMICliente.java
EcoRMI
EcoRMI 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 entrada
System.out.print
System.out.print("Eco> "); ("Eco> "); while
while ((((mensajeEnviadomensajeEnviado = = in.readLinein.readLine()) != ()) != nullnull) { ) { mensajeRecibido
mensajeRecibido = = miEco.eco(mensajeEnviadomiEco.eco(mensajeEnviado);); System.out.println(mensajeRecibido
System.out.println(mensajeRecibido); ); System.out.print
System.out.print("Eco> "); ("Eco> "); }
}
}
} catch(Exceptioncatch(Exception e) { e) { System.err.println
System.err.println("("ExcepcionExcepcion de Sistema: " + e); de Sistema: " + e); } } System.exit System.exit(0); (0); } } } }
EcoRMICliente.java
EcoRMICliente.java
(2/2)
(2/2)
Compilar el cliente
Compilar 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:
\
\
rmi4
rmi4
\
\
cliente
cliente
:
:
>>cdcd c:c:\\rmi4rmi4\\clientecliente
Lanzar el
Lanzar el
rmiregistry
rmiregistry
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 importanteimportante
advertir 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)
Lanzar el servidor
Lanzar 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:
Lanzar el cliente
Lanzar 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.policy
EcoRMICliente
La ejecución
La ejecución
Una 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 ventanas
en las dos ventanas
Cliente Servidor