sábado, 14 de febrero de 2009

Usando CORBA con el compilador de java

En 4 pasos describiré como usar corba.

PASO 1:
Lo primero que hay que hacer es crear el idl, la interface que deberá ser implementada

ClienteRemoto.idl
module ClienteRemoto{
              interface ClienteRem
             {
                   string Saludar(in string nombre);
     };
};
Esta idl será compilada para usar POA (Portable Object Adaptor) con el comando idlj de java :
>idlj -fall ClienteRemoto.idl

este comando creará una carpeta de nombre ClienteRemoto dentro de ella existirá el codigo necesario tanto en el servidor y en el cliente 

PASO 2:
Implementamos la interface que se creó usando el idl , crearemos un archivo llamado ClienteRemImp.java y haremos que extienda de la interface ClienteRemotoPOA que se encuentra en la carpeta  ClienteRemoto

ClienteRemImpl.java

public class ClienteRemImpl extends ClienteRemoto.ClienteRemPOA
{
                 public ClienteRemImpl(){}
                 public String Saludar(String nombre){
                        return "Hola "+nombre;
                  }
}
PASO 3 
Crear el Servidor que se quedará escuchando por peticiones

Servidor.java

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
                         public class Servidor{
                             public static void main(String[] args){
                                      //inicializa orb 
                                        System.out.println("Iniciando");
                                       try {
                                               // crear e inicializar ORB
                                               ORB orb = ORB.init(args, null);
                                                // crear un objeto remoto
                                              ClienteRemImpl impl = new ClienteRemImpl();
                                               // obtener referencia rootpoa y activar el POAManager
                                               POA rootpoa = POAHelper.narrow(orb
                                                                                  .resolve_initial_references("RootPOA"));
                                              rootpoa.the_POAManager().activate();
                                             // obtener una referencia al objeto remoto
                                               org.omg.CORBA.Object ref = rootpoa.servant_to_reference(impl);
                                             ClienteRemoto.ClienteRem href =                                    ClienteRemoto.ClienteRemHelper.narrow(ref);
                                               // las siguientes lineas me permiten publicar un obj remoto
                                                org.omg.CORBA.Object objRef = orb
                                                                   .resolve_initial_references("NameService");
                                                NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
                                               // nombre con el cual voy a publicar mi objeto
                                                 String nombre = "ClienteRemoto";
                                                 NameComponent path[] = ncRef.to_name(nombre);
                                                // publicar el objeto
                                                 ncRef.rebind(path, href);
                                                // ejecutar el orb
                                                orb.run();
                                      } catch (Exception e) {
                                                   System.err.println("ERROR: " + e);
                                     }
       }
}
Paso 4
Crear el cliente, que usará los objetos remotos

Cliente.java 

import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
     public class Cliente {
        public static void main(String args[]) {
            try{
                ORB orb = ORB.init(args,null);
// obtener una referencia a NameService
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
// las siguientes lineas nos permiten obtener una ref a un objeto remoto
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// nombre del obj remoto
String nombre = "ClienteRemoto";
   ClienteRemoto.ClienteRem impl =ClienteRemoto.ClienteRemHelper.narrow(ncRef.resolve_str(nombre));
System.out.println(impl.Saludar("Irene"));
}
catch (Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
}
}
 Ahora si, a compilar y usar, en la ventana de comando nos movemos al directorio donde hemos creado estos archivos y ejecutamos
 
> java *.java

luego en consolas  diferentes ejecutamos

>orbd -ORBInitialPort 2500
 
>java Servidor -ORBInitialPort 2500
 
>java Cliente -ORBInitialPort 2500

y hemos creado el hola mundo distribuido usando CORBA , espero sea útil.









15 comentarios:

Miguel Espinoza dijo...

Más claro que el esto no existe, excelente publicación

Anónimo dijo...

no entiendo como ejecutar el idl :(

felipetamayo dijo...

anonimo es muy sencillo desde consola ejecuta ese comando parado en la ubicacion donde escribiste tu codigo (tu codigo debio ser escrito en un gedit q es como un block de notas para linux) espero que te sirva

yo tengo problemas para ejecutar el ultimo comando al final me saca el siguiente error:

Exception in thread "main" java.lang.NoClassDefFoundError: */java
Caused by: java.lang.ClassNotFoundException: *.java
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: *.java. Program will exit.

Espero me puedan ayudar

Muchas Gracias!!

felipetamayo dijo...

hola creo q arregle mi problema era cambiar el comando:

javac java.*

sin embargo tengo un error:

ClienteRemlmpl.java:1: class ClienteRemImpl is public, should be declared in a file named ClienteRemImpl.java
public class ClienteRemImpl extends ClienteRemoto.ClienteRemPOA
^
Note: ClienteRemPOA.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

que puede ser? ayuda!!

gracias

felipetamayo dijo...

HOla creo q solucione mi problema ya q cuando ejecuto la compilacion me sale esto:
Note: ClienteRemPOA.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.


ahora cuando intento ejecutar mi programa en diferentes consolas me pasa esto:

orbd -ORBInitialPort 2500

cuando ejecuto este al parece trabaja bien ya q si intento cerrar la consola esta me dice q hay un proceso ejecutandose

pero al momento de ejecutar estas dos instrucciones:
java Servidor -ORBInitialPort 2500

>java Cliente -ORBInitialPort 2500

me aparece el siguiente error:

felipe@felipe-desktop:~/Escritorio/corbatest/ClienteRemoto/orb.db$ java Servidor -ORBInitialPort 2500
Exception in thread "main" java.lang.NoClassDefFoundError: Servidor
Caused by: java.lang.ClassNotFoundException: Servidor
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: Servidor. Program will exit.

Espero q me puedan colaborar, esto ya parece un monologo, si suben esto a un foro se deberia ver mas ayuda.

gracias

Irene dijo...

lo siento felipe pero no me acuerdo ,, hace ufff que puse el post jeje

felipetamayo dijo...

hmm ok muchas gracias, no podrias intarlo tu nuevamente, tu tutorial es el mas claro q he encontrado hasta al momento, y recien estoy empesando este tema, me esta dando mucha dificultad. Por cierto tengo algunas dudillas teoricas sobre corba no se si tal vez me la podrias aclarar si puedes agregame al msn andrewt12357@hotmail.com

Muchas Gracias!!

Irene dijo...

pero al parecer no se esta creando bien alguna clase dice java class no found podrias googlear por el error

Anónimo dijo...

Hola como podria aplicar corba
para mandar canciones cliente servidor...
tienes algun ejemplo o tutorial??

Anónimo dijo...

Para que no les salga errores, las clases que te genera el idlj las dejan dentro de la carpeta, y las 3 que se crean, me refiero a la clase ClienteRemImpl.java, a la clase Servidor.java y a la clase Cliente.java esas van fuera de la carpeta, asi no les causara errores.

Para compilarlos solo es de esta manera:

- Para las clases que estan dentro de la carpeta, se posicionan en la linea de comandos hasta donde estan las clases y ponen esto:

> javac *.java

- Para las 3 clases que estan afuera de la carpeta se posicionan hasta donde estan estas clases y ponen esto:

>orbd -ORBInitialPort 2500

>java Servidor -ORBInitialPort 2500

>java Cliente -ORBInitialPort 2500

Ya con eso no deben de tener ningun problema... yo ya lo hice y funciona de maravilla....

Anónimo dijo...

Me falto decirles que despues de esta parte:

/*
- Para las clases que estan dentro de la carpeta, se posicionan en la linea de comandos hasta donde estan las clases y ponen esto:

> javac *.java

*/

Se posicionan afuera de la carpeta en la linea de comandos y vuelven a poner esto:

> javac *.java

Para que se compilen las clases que estan afuera ya que la primera vez que lo ingresamos era para que se compilaran los que estaban dentro de la carpeta... ya una vez compilados tanto los de la carpeta como las 3 clases que estan afuera ya pueden hacer esto:

- Se posicionan hasta donde estan las 3 clases que creamos manualmente y ponen esto:

>orbd -ORBInitialPort 2500

>java Servidor -ORBInitialPort 2500

>java Cliente -ORBInitialPort 2500

Y ya debe jalar sin errores.... Cualquier duda ponganla...

Anónimo dijo...

En verdad muchas gracias... Su codigo es el primero que funciona completamente, porque en la red encontre otros que me daban errores diferentes... Gracias de nuevo!!

Warrior Princess dijo...

que bueno que despues de tanto tiempo haya servido :)

Carlos Bridi dijo...

Olá, Muito bom o Tutorial,
Mas estou com problemas, tens como me enviar o teu projeto ?

carlosbridi@gmail.com

Obrigado, muito obrigado!

Anónimo dijo...

Seridor.java:15 cannot find synbol
symbol: class ClienteRem
location class Servidor