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);
};
};
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;
}
}
{
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);
}
}
}
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);
}
}
}
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.
16 comentarios:
Más claro que el esto no existe, excelente publicación
no entiendo como ejecutar el idl :(
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!!
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
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
lo siento felipe pero no me acuerdo ,, hace ufff que puse el post jeje
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!!
pero al parecer no se esta creando bien alguna clase dice java class no found podrias googlear por el error
Hola como podria aplicar corba
para mandar canciones cliente servidor...
tienes algun ejemplo o tutorial??
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....
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...
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!!
que bueno que despues de tanto tiempo haya servido :)
Olá, Muito bom o Tutorial,
Mas estou com problemas, tens como me enviar o teu projeto ?
carlosbridi@gmail.com
Obrigado, muito obrigado!
Seridor.java:15 cannot find synbol
symbol: class ClienteRem
location class Servidor
Publicar un comentario