Está en la página 1de 9

Java RMI

Ejemplo bsico
Arquitectura
Cliente Servidor

Cliente.java
Cliente.java Servidor.java
Servidor.java

Stub
Stub Skeleton
Skeleton

RMI RMI

Internet
Arquitectura
Cliente (Remote)
(Remote) Servidor
Interface
Interface

Cliente.java
Cliente.java Servidor.java
Servidor.java
rmic

Stub
Stub Skeleton
Skeleton
RMI Registry
Leyenda:

manual
manual
RMI RMI
generado
generado
Internet
infraestructra
infraestructra
El interfaz rmi
Mtodos con tipos bsicos, que
implementan Serializable, o que
implementan Remote
RemoteDate.java
RemoteDate.java
package p4;

import java.rmi.*;
import java.util.Date;

public interface RemoteDate extends java.rmi.Remote{

/* Constructor */
public Date getRemoteDate() throws java.rmi.RemoteException;

/*El nombre del servicio para el registro */


public final static String LOOKUPNAME = "RemoteDate";
}
Ojo: no puede tener espacios
El cliente
package p4; DateClient.java
DateClient.java
import java.rmi.*;
import java.util.Date;

public class DateClient {

protected static RemoteDate netConn = null;

public static void main(String[] args) {


try{
netConn = (RemoteDate)Naming.lookup(RemoteDate.LOOKUPNAME);
Date fecha = netConn.getRemoteDate();
System.out.println(fecha);
}catch (Exception e){
System.err.println("Excepcin en RemoteDate: " +
e.getMessage());
e.printStackTrace();
}
}
}
El servidor
package p4; DateServer.java
DateServer.java
import java.rmi.*;

public class DateServer { Crea una nueva instancia


de DateServer
public static void main(String[] args) {
try{
//Creo una instancia del objeto que ser compartido
RemoteDateImpl im = new RemoteDateImpl();
System.out.println("Arrancando DateServer...");
Da error hasta que
//Registro y saco del Registro
Naming.rebind(RemoteDate.LOOKUPNAME, im); exista el stub/skeleton
System.out.println("...OK");

}catch(Exception e){ bind da error si el nombre ya


System.err.println(e);
System.exit(1);
estaba definido en el rmiregistry (este
} es el caso cuando cae el servidor y se
} arranca de nuevo), as que mejor usar
}
siempre rebind
La implementacin del servidor
package p4; RemoteDateImpl.java
RemoteDateImpl.java
import java.rmi.*;
import java.rmi.server.*; Podra sutituirse por:
java.rmi.server.UnicastRemoteObject.exportObject(this);
import java.util.Date;

public class RemoteDateImpl extends UnicastRemoteObject


implements RemoteDate{

public RemoteDateImpl() throws RemoteException {//Por Implementar UnicastRemoteObject

super(); //Deja listas la comunicaciones


}

/** La implementacin del interfaz remoto*/


public Date getRemoteDate() throws RemoteException{
return new Date();
}
} Implementacin del mtodo del interfaz rmi
Paso a paso (Windows)
Compilamos cdigo de cliente y servidor:
javac p4\*.java La opcin d permite generar
en el directorio indicado. Si no se
Generamos stub y skeleton: indica genera en el dir actual
rmic -classpath . p4.RemoteDateImpl
(esto genera los ficheros RemoteDateImpl_Stub.class y RemoteDateImpl_Skel.class a
partir de RemoteDateImpl.class)

Arrancamos el rmiregistry (en el servidor):


start rmiregistry
rmiregistry debe estar en el PATH
Arrancamos el servidor:
start java p4.DateServer

Arrancamos el/los cliente/s:


java p4.DateClient

Nota:
1.- se asume que todos los .java estn en el mismo directorio
2.- en Java 1.5, rmic no se genera RemoteDateImpl_Skel.class, sino que se crea
dinmicamente y se usa cuando se necesita. Usa protocolo rmi 1.2.
Para garantizar portabilidad, la opcin vcompat usa el protocolo rmi antiguo
Mquinas distintas
Si el cliente y el servidor estn en
mquinas distintas:
El rmiregistry corre en la mquina del
servidor
El .java del cliente cambia
Por ejemplo: lookup(arg[0]) har que el cliente
se invoque as:
DateClient //x.y.z.k/RemoteDate

IP del servidor

También podría gustarte