miércoles, 8 de octubre de 2008

Java RMI - Ejemplo de Hello World

Hola aqui les voy a publicar como se implementa un Hello World con RMI ojala les sea util


Archivo “IServer.java”

Es importante tener una interfaz, ya que el cliente no debe conocer la implementacion del servidor. Solo necesita saber como es. Y esta debe extender de Remote.

import java.rmi.RemoteException;

import java.rmi.Remote;

/**

* En la interfaz definimos cuales son los metodos que van a poder ser accedidos remotamente

* @author Ernesto Maldonado Thomas

*/

public interface IServer extends Remote{

/**

* Por este metodo vamos a enviar al Servidor una cadena para que la imprima

* @param text Texto que vamos a enviar

* @throws RemoteException Si algo falla tira un RemoteException

*/

void sayHello(String text) throws RemoteException; // Es importante ponerle el

// throws RemoteException

}

Archivo “Server.java”

La implementacion de dicha interfaz debe extender de UnicastReomteObject para que el objeto pueda ser visto a travez de la red. O mejor dicho publicado o exportado en el RMIRegistry

import java.rmi.*;

import java.rmi.server.*;

/**

* Esta es la implementacion de nuestro servidor

* @author Ernesto Maldonado Thomas

*/

public class Server extends UnicastRemoteObject implements IServer {

/**

* Al heredar de UnicastRemoteObject nos obliga a poner

* este constructor

* @throws RemoteException

*/

public Server() throws RemoteException {

super();

}

/* (non-Javadoc)

* @see IServer#sayHello(java.lang.String)

*/

public void sayHello(String text) throws RemoteException {

System.out.println("Hello from: " + text);

}

}

Archivo “Main.java”

En el archivo Main Inicializa el RmiRegistry y hace bind con el Objeto es decir conecta el Servidor RMI con el Objeto que implementamos.

import java.rmi.registry.*;

public class Main {

public static void main (String []args) {

try {

// Habilitamos el Registro con un puerto

Registry registry = LocateRegistry.createRegistry(2320);

// Le decimos al registro que un objeto Server podra ser

// intanciado con el ID "Server"

// por lo tanto la direccion de este objeto seria:

// "rmi://localhost:2320/Server"

registry.rebind("Server", new Server());

} catch (Exception e){

e.printStackTrace();

}

}

}

PARA EL STUB “Server_Stub.java”

El Stub es una clase generada con el “rmic” y la tiene que tener el cliente junto con la interfaz para poder instanciar la implementacion del Servidor. Para generar este archivo hay que compilar primero el Server.java y luego con rmic generar el Stub ej:

C:\>javac Server.java

C:\>rmic Server -keep

// Stub class generated by rmic, do not edit.

// Contents subject to change without notice.

public final class Server_Stub

extends java.rmi.server.RemoteStub

implements IServer, java.rmi.Remote

{

private static final long serialVersionUID = 2;

private static java.lang.reflect.Method $method_sayHello_0;

static {

try {

$method_sayHello_0 = IServer.class.getMethod("sayHello", new java.lang.Class[] {java.lang.String.class});

} catch (java.lang.NoSuchMethodException e) {

throw new java.lang.NoSuchMethodError(

"stub class initialization failed");

}

}

// constructors

public Server_Stub(java.rmi.server.RemoteRef ref) {

super(ref);

}

// methods from remote interfaces

// implementation of sayHello(String)

public void sayHello(java.lang.String $param_String_1)

throws java.rmi.RemoteException

{

try {

ref.invoke(this, $method_sayHello_0, new java.lang.Object[] {$param_String_1}, 5653759431040960862L);

} catch (java.lang.RuntimeException e) {

throw e;

} catch (java.rmi.RemoteException e) {

throw e;

} catch (java.lang.Exception e) {

throw new java.rmi.UnexpectedException("undeclared checked exception", e);

}

}

}

PARA EL CLIENTE

Archivo “rmi.policy”

Es importante en este tipo de aplicaciones establecer los permisos. Y con este archivo se hace

grant {

permission java.security.AllPermission;

};

Archivo “Cliente.java”

El Cliente inicializa la seguridad para poder conectarse y obtiene la referencia al objeto remoto e invoca al objeto remoto.

import java.rmi.Naming;

public class Cliente {

public static void main(String []args) {

try {

// Le decimos que use el archivo "rmi.policy" para permisos. Otorgandole todos

System.setProperty("java.security.policy","rmi.policy");

// Inicializamos el Security Manager

System.setSecurityManager(new SecurityManager());

// Obtenemos una instancia usando el url.

IServer s = (IServer) Naming.lookup("rmi://localhost:2320/Server");

// Invocamos el metodo que se ejecutara remotamente

s.sayHello("Ernesto");

} catch (Exception e) {

e.printStackTrace();

}

}

}

Bueno final mente para poder ejecutarlo hay que llamar al Main (Servidor) y al Cliente en diferentes consolas

C:\>java Main

Y en otra consola

C:\>java Cliente

Con esto ya tenemos un simple HelloWorld de RMI, espero que les guste y que les sirva. Recomendación. Usar un editor de texto como NotePad++ y el compilador de java 1.5 y compilar desde la consola. No usar eclipse, aprendanlo asi para que sepan el por que de cada paso.

3 comentarios:

Anónimo dijo...

Mil mil gracias...
La vdd no tenia ni idea de por donde empezar...
Grax x publicarlo...
Tratare de entenderlo e implementarlo...
nuevament gracias

Unknown dijo...

muchas gracias muy bueno!, quizas me podrias orientar, porque no puedo crear otro metodo en IServidor, tengo entendido que ahi solo va la interfaz (ok), y la implementacion en el servidor. Pero le doy vueltas y me da un error

Trate de duplicar el que ya tenias y tampoco, sabes que estoy haciendo mal?

Ing. Ernesto Maldonado dijo...

Dime cual es el mensaje de error que te sale?

Recuerda que la interfaz debe ser comun.