Está en la página 1de 14

3.- Ejemplo "Hello world" en Cliente/Servidor Construiremos el tpico programa de ejemplo que imprime la cadena "Hello world!!

", pero en versin cliente/servidor con CORBA. Se tratar de una aplicacin distribuida usando el Java IDL. El programa tiene una slo operacin que devuelve una cadena, la cual imprimir. Todos los fundamentos tericos que necesitamos para comprender el ejemplo ya han sido expuestos previamente. Este diagrama muestra el proceso de comunicacin entre el cliente y el servidor, a travs del IIOP:

Estos son los pasos que se lleva a cabo: 1. 2. 3. 4. 5. El cliente invoca la operacin sayHello del servidor HelloServer. El ORB transfiere dicha invocacin al objeto servidor registrado para el interface IDL. El mtodo sayHello del servidor se ejecuta, devolviendo un String. El ORB transfiere ese String de vuelta al cliente. El cliente imprime el valor del String obtenido.

Aunque tenga un diseo muy simple, este programa de ejemplo le permite aprender y experimentar con todas las tareas que se requieren para desarrollar casi cualquier programa en CORBA que use invocacin esttica. Antes de empezar a trabajar con Java IDL, usted necesita dos cosas: la versin 1.2 del JDK y el compilador idl2java (de VisiBroker for Java). El JDK proporciona el API y el ORB necesarios para habilitar la interaccin entre los objetos distribuidos basado en CORBA. El compilador idl2java usa el mapeo IDL -> Java para convertir las definiciones de interfaces escritas en IDL a los interfaces, clases y mtodos correspondientes en Java, que usaremos para implementar el cdigo del cliente y del servidor. Estos son los pasos: Escribir el interfaz IDL Escribir el Cliente Escribir el Servidor Compilar y Ejecutar la aplicacin

4.- Escribir el interfaz IDL En esta seccin escribiremos un interfaz IDL simple para el programa Hello World. El interface IDL define el contrato entre las partes cliente y servidor de su aplicacin, especificando qu operaciones y atributos estn disponibles. OMG IDL es independiente del lenguaje de programacin. Usted debe mapearlo a Java antes de escribir el cdigo que implemente los servicios (el programa idl2java lo hace de forma automtica).

4.1.- Escribiendo Hello.idl OMG IDL es un lenguaje puramente declarativo diseado para especificar interfaces para aplicaciones distribuidas de una forma independiente del lenguaje. OMG especifica un mapeo de IDL a varios lenguajes de programacin, incluyendo C, C++, Smalltalk, COBOL, Ada y Java. Cuando se mapea, cada orden en OMG IDL se traduce a su correspondiente orden en el lenguaje de programacin elegido. Usted puede usar la herramienta idl2java para mapear un interfaz en IDL a Java e implementar la clase del cliente. Cuando usted mapea el mismo IDL sobre C++ e implementa el servidor en ese lenguaje, el cliente en Java y el servidor en C++ pueden comunicarse a travs del ORB como si estuvieran escritos en el mismo lenguaje. El IDL para Hello World es extremadamente simple; su nico interface tiene una nica operacin. Usted necesita realizar slo los tres pasos que se describen abajo:

4.1.1.- Declarar el Mdulo IDL de CORBA Un mdulo de CORBA es un espacio de nombre que acta como un contenedor para los interfaces y declaraciones asociados. Se corresponde a un paquete de Java. Cada mdulo en un fichero IDL se mapea a un paquete de Java. La declaracin del mdulo HelloApp se hace as: module HelloApp { // Las dems lneas van aqu. }; 4.1.2.- Declarar la Interface As como los interfaces en Java, los interfaces de CORBA declaran el API que usan los objetos para llamarse unos a otros. Cada interface en IDL se mapea con un interface en Java. Escribiremos en el fichero Hello.idl el interface Hello: module HelloApp { interface Hello { // Aqu irn las operaciones. }; }; 4.1.3.- Declarando las Operaciones Las operaciones de CORBA tienen el comportamiento que prometen los servidores realizar cuando los clientes los invocan. Este compromiso viene indicado en el IDL. Cada sentencia de operacin en IDL genera su correspondiente sentencia de mtodo en el interfaz generado de Java. Introducimos la operacin en el fichero Hello.idl: module HelloApp { interface Hello { string sayHello(); // Aadimos esta lnea. }; };

4.2.- Mapeando Hello.idl de IDL a Java La herramienta idl2java lee los ficheros OMG IDL y crea los ficheros Java necesarios. Por defecto, el comportamiento de la herramienta es generar tanto el cliente como el servidor (tal como necesitamos para nuestro ejemplo), simplemente le pasamos como parmentro el fichero IDL que hemos creado antes: $ idl2java Hello.idl Si usted lista el contenido del directorio, ver que se ha creado un directorio llamado HelloApp, el cual contiene cinco ficheros. El contenido del fichero Hello.java es similar a esto: /* Hello.java as generated by idltojava */ package HelloApp; public interface Hello extends org.omg.CORBA.Object { String sayHello(); } Con el interface tan simple que tenemos, es fcil comprobar cmo se ha hecho el mapeo para generar el cdigo Java a partir del IDL:

Sentencia IDL

Sentencia Java

module HelloApp package HelloApp; interface Hello public interface Hello

string sayHello(); String sayHello();

La nica sorpresa es la sentencia extends. Todos los objetos CORBA derivan de org.omg.CORBA.Object para asegurarse que se tiene toda la funcionalidad CORBA.

4.3.- Comprendiento la salida de idl2java El compilador idl2java genera una serie de ficheros, basndose en las opciones que le pasamos en la lnea de comnados. Dado que proporciona una funcionalidad por defecto, usted puede ignorar estas opciones por ahora. Los cinco fichero generados son: 4.3.1.- _HelloImplBase.java Esta clase abstracta es el skeleton del servidor, proporcionando una funcionalidad CORBA bsica para el servidor. Implementa el interface Hello.java. La clase del servidor HelloServant hereda de _HelloImplBase. /* * File: ./HelloApp/_HelloImplBase.java * From: Hello.idl * Date: Thu Jul 3 09:46:22 2000 * By: idltojava Java IDL 1.2 Jul 12 1997 12:23:47 */ package HelloApp; public abstract class _HelloImplBase extends org.omg.CORBA.DynamicImplementation implements HelloApp.Hello { // Constructor public _HelloImplBase() { super(); } // Type strings for this class and its superclases private static final String _type_ids[] = { "IDL:HelloApp/Hello:1.0" }; public String[] _ids() { return (String[]) _type_ids.clone(); } private static java.util.Dictionary _methods = new java.util.Hashtable(); static { _methods.put("sayHello", new java.lang.Integer(0)); } // DSI Dispatch call public void invoke(org.omg.CORBA.ServerRequest r) { switch (((java.lang.Integer) _methods.get(r.op_name())).intValue()) { case 0: // HelloApp.Hello.sayHello { org.omg.CORBA.NVList _list = _orb().create_list(0); r.params(_list); String ___result; ___result = this.sayHello(); org.omg.CORBA.Any __result = _orb().create_any(); __result.insert_string(___result); r.result(__result); }

break; default: throw new org.omg.CORBA.BAD_OPERATION(0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE); } } } 4.3.2.- _HelloStub.java Esta clase es el stub del cliente, proporcionando funcionalidad CORBA al cliente. Implementa el interface Hello.java. /* * File: ./HelloApp/_HelloStub.java * From: Hello.idl * Date: Thu Jul 3 09:46:22 2000 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */ package HelloApp; public class _HelloStub extends org.omg.CORBA.portable.ObjectImpl implements HelloApp.Hello { public _HelloStub(org.omg.CORBA.portable.Delegate d) { super(); _set_delegate(d); } private static final String _type_ids[] = { "IDL:HelloApp/Hello:1.0" }; public String[] _ids() { return (String[]) _type_ids.clone(); } // IDL operations // Implementation of ::HelloApp::Hello::sayHello public String sayHello() { org.omg.CORBA.Request r = _request("sayHello"); r.set_return_type(org.omg.CORBA.ORB.init().get_primitive_tc( org.omg.CORBA.TCKind.tk_string)); r.invoke(); String __result; __result = r.return_value().extract_string(); return __result; } }; 4.3.3.- Hello.java Este interface contiene la versin en Java del interface en IDL. Contiene un slo mtodo llamado sayHello. El interface Hello.java hereda de org.omg.CORBA.Object, proporcionando tambin una funcionalidad CORBA estndar. /* * File: ./HelloApp/Hello.java * From: Hello.idl * Date: Thu Jul 3 09:46:22 2000 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */

package HelloApp; public interface Hello extends org.omg.CORBA.Object { String sayHello(); } 4.3.4.- HelloHelper.java Esta ltima clase proporciona una funcionalidad auxiliar, ms que nada el pequeo mtodo necesario para hacer la conversin de la referencia al objeto CORBA a sus tipos adecuados. /* * File: ./HelloApp/HelloHelper.java * From: Hello.idl * Date: Thu Jul 3 09:46:22 2000 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */ package HelloApp; public class HelloHelper { // It is useless to have instances of this class private HelloHelper() { } public static void write(org.omg.CORBA.portable.OutputStream out, HelloApp.Hello that) { out.write_Object(that); } public static HelloApp.Hello read(org.omg.CORBA.portable.InputStream in) { return HelloApp.HelloHelper.narrow(in.read_Object()); } public static HelloApp.Hello extract(org.omg.CORBA.Any a) { org.omg.CORBA.portable.InputStream in = a.create_input_stream(); return read(in); } public static void insert(org.omg.CORBA.Any a, HelloApp.Hello that) { org.omg.CORBA.portable.OutputStream out = a.create_output_stream(); write(out, that); a.read_value(out.create_input_stream(), type()); } private static org.omg.CORBA.TypeCode _tc; synchronized public static org.omg.CORBA.TypeCode type() { if (_tc == null) _tc = org.omg.CORBA.ORB.init().create_interface_tc(id(), "Hello"); return _tc; } public static String id() { return "IDL:HelloApp/Hello:1.0"; } public static HelloApp.Hello narrow(org.omg.CORBA.Object that) throws org.omg.CORBA.BAD_PARAM { if (that == null) return null; if (that instanceof HelloApp.Hello) return (HelloApp.Hello) that; if (!that._is_a(id())) { throw new org.omg.CORBA.BAD_PARAM(); } org.omg.CORBA.portable.Delegate dup = ((org.omg.CORBA.portable.ObjectImpl)that)._get_delegate(); HelloApp.Hello result = new HelloApp._HelloStub(dup); return result; } }

4.3.5.- HelloHolder.java Esta ltima clase contiene un miembro de instancia pblica del tipo Hello. Proporciona las operaciones para trabajar con los argumentos que tiene CORBA pare no se pueden mapear fcilmente en la semntica de Java: /* * File: ./HelloApp/HelloHolder.java * From: Hello.idl * Date: Thu Jul 3 09:46:22 2000 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */ package HelloApp; public final class HelloHolder implements org.omg.CORBA.portable.Streamable{ // instance variable public HelloApp.Hello value; // constructors public HelloHolder() { this(null); } public HelloHolder(HelloApp.Hello __arg) { value = __arg; } public void _write(org.omg.CORBA.portable.OutputStream out) { HelloApp.HelloHelper.write(out, value); } public void _read(org.omg.CORBA.portable.InputStream in) { value = HelloApp.HelloHelper.read(in); } public org.omg.CORBA.TypeCode _type() { return HelloApp.HelloHelper.type(); } } Cuando usted escribe un interface IDL, usted ya hace todo el trabajo para generar todos estos ficheros necesarios para su aplicacin distribuida. El nico trabajo adicional que debe hacer es implementar la funcionalidad del cliente y del servidor. Esto es lo que veremos en los siguientes captulos. 5.- Desarrollo del Cliente En esta seccin veremos como dar una funcionalidad a una aplicacin cliente en CORBA.

5.1.- Realizar una configuracin bsica El cascarn bsico de un cliente CORBA es el mismo que muchas aplicaciones Java: se importan los paquetes requeridos, declaramos la clase de la aplicacin, definimos el mtodo main y procuramos manejar cualquier excepcin. 5.1.1.- Importando los paquetes requeridos Vamos a crear un nuevo fichero llamado HelloClient.java en el directorio del proyecto. Importaremos los paquetes necesarios: import HelloApp.*; // El paquete que contienes nuestros stubs. import org.omg.CosNaming.*; // HelloClient usar el servicio de nombrado. import org.omg.CORBA.*; // Necesario para todas las aplicaciones CORBA. 5.1.2.- Declarando la clase del cliente En el fichero HelloClient.java, declaramos la clase del cliente:

public class HelloClient { // Aqu ir el mtodo main. } 5.1.3.- Definiendo el mtodo main Cada aplicacin Java necesita un mtodo main. Declremos dentro de la clase HelloClient: public static void main(String args[]) { // Ponga aqu el bloque try-catch. } 5.1.4.- Manejando las excepciones CORBA Dado que todos los programas CORBA pueden lanzar excepciones del sistema CORBA en tiempo de ejecucin, usted debe englobar toda la funcionalidad principal dentro de un bloque try-catch. Los programas CORBA lanzan excepciones siempre que ocurre un problema durante alguno de los procesos involucrados en la invocacin del servidor por parte del cliente. Nuestro manejador de excepciones simplemente imprime el nombre de la excepcin y la traza de la pila por la salida estandar, as podr ver qu cosas han ido mal. Dentro del main, pondremos el bloque try-catch: try { // Aada el resto del cdigo del cliente aqu. } catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); }

5.2.- Crear un objeto ORB Un cliente CORBA necesita un objeto ORB local para realizar todo el trabajo de conversin de datos y comunicacin. Cada cliente instancia un objeto org.omg.CORBA.ORB y lo inicializa pasndole cierta informacin sobre s mismo. En el fichero HelloClient.java, dentro del bloque try-catch, declaramos e inicializamos una variable ORB: ORB orb = ORB.init(args, null); La llamada al mtodo init del ORB le pasa los argumentos de la lnea de comando, permitindole establecer ciertas propiedades en tiempo de ejecucin.

5.3.- Encontrar el Servidor Hello Una vez que la aplicacin tiene un ORB, puede preguntar al ORB para localizar el servicio que necesita, que en nuestro caso es el servidor Hello. Un cliente CORBA tiene varias formas de obtener una referencia inicial; nuestra aplicacin cliente usar el COS Naming Service especificado por OMG y proporcionado por Java IDL. 5.3.1.- Obtener el Contexto Inicial de Nombrado El primer paso que hay que dar para usar el Servicio de Nombrado (Naming Service) es obtener el contexto inicial de nombrado. En el bloque try-catch, bajo la inicializacin del ORB, llamaremos a orb.resolve_initial_references para obtener una referencia a un objeto del servidor de nombres: org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); La cadena "NameService" est definida para todos los ORBs de CORBA. Cuando usted pasa esa cadena, el ORB devuelve el contexto inicial de nombrado, una referencia a un objeto del servidor de nombres.

5.3.2.- Ajustar la Referencia a Objeto Como con todos las referencias a objetos CORBA, objRef es un objeto CORBA genrico. Para usarlo como un objeto NamingContext (Contexto de Nombrado), usted debe ajustarlo a su tipo adecuado. Aada la llamada para ajustarlo debajo de la sentencia anterior: NamingContext ncRef = NamingContextHelper.narrow(objRef); Aqu vemos el uso de una clase de ayuda generada por idl2java, similar en su funcin a HelloHelper. El objeto ncRef es ahora del tipo org.omg.CosNaming.NamingContext y usted puede usarlo para acceder al servicio de nombrado y encontrar otros servicios. Eso lo haremos en el siguiente paso. 5.3.3.- Encontrar un Servicio de Nombrado Los nombres pueden tener diferentes estructuras dependiendo de la implementacin del servicio de nombrado. Consecuentemente, los servidores de nombres de CORBA manejan nombres complejos en forma de objetos NameComponent. Cada NameComponent tiene una sola parte , o elemento, del nombre. Un vector de objetos NameComponent pueden albergar un camino a un objeto completamente especificado, ya sea en un fichero o en un disco del sistema. Para encontrar el servidor Hello, usted necesita un NameComponent para almacenar una cadena identificativa para el servidor Hello. Aada este cdigo directamente debajo de la llamada de ajuste: NameComponent nc = new NameComponent("Hello", ""); Esta instruccin establece el campo de identificacin de nc, el nuevo NameComponent, a "Hello" y el campo de tipo a una cadea vaca. Dado que el camino al objeto Hello tiene slo un elemento, crearemos un vector de un slo elemento de nc. El mtodo NamingContext.resolve necesita este vector para su trabajo: NameComponent path[] = {nc}; Finalmente, pasamos el camino al mtodo de resolucin del servicio de nombres para obtener una referencia al servidor Hello y ajustarlo a un objeto Hello: Hello helloRef = HelloHelper.narrow(ncRef.resolve(path)); Aqu podemos ver la clase de ayuda HelloHelper trabajando. El mtodo de resolucin devuelve un objeto CORBA genrico como usted vio ms arriba cuando localizbamos el servicio de nombrado. Por tanto, usted lo ajusta a un objeto Hello, que es el objeto referenciado que necesitamos para efectuar el resto del trabajo.

5.4.- Invocando la Operacin sayHello Las invocaciones en CORBA se parecen a una llamada a un objeto local. Las complicaciones de ajuste de tipos de datos (marshaling y unmarshaling) , ruteo y dems son completamente transparentes al programador del cliente. Dado que ya hay mucho hecho por el cdigo generado, la invocacin es realmente la parte ms fcil de la programacin en CORBA. Continuando en el cloque try-catch del fichero HelloClient.java, introduzca la siguiente invocacin debajo de la resolucin del nombre del servicio: String hello = helloRef.sayHello(); Finalmente, aada cdigo para imprimir el resultado de la invocacin a la salida estandar: System.out.println(hello); El fichero HelloClient.java completo es el siguiente: import HelloApp.*; // El paquete que contienes nuestros stubs. import org.omg.CosNaming.*; // HelloClient usar el servicio de nombrado.

import org.omg.CORBA.*; // HelloClient usar el servicio de nombrado.

public class HelloClient { public static void main(String args[]) { try{ // Crea e inicializa el ORB ORB orb = ORB.init(args, null); // Obtiene el contexto de nombrado raiz org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // Resuelve la referencia al objeto en el nombrado NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; Hello helloRef = HelloHelper.narrow(ncRef.resolve(path)); // Llama al objeto servidor Hello e imprime el resultado String hello = helloRef.sayHello(); System.out.println(hello); } catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); } } } Ahora ya puede escribir el cdigo del servidor. 6.- Desarrollo del Servidor Ahora nos toca implementar el servidor HelloServer.java.

6.1.- Realizando una configuracin bsica La estructura de un programa servidor en CORBA es la misma que la de muchas aplicaciones en Java: usted importa los paquetes necesarios, declara la clase servidora, define el mtodo main y maneja cualquier excepcin que ocurra. 6.1.1.- Importando los paquetes requeridos Crearemos un fichero llamado HelloServer.java. Luego importaremos los paquetes necesarios para esta clase: import HelloApp.*; // El paquete que contienes nuestros stubs. import org.omg.CosNaming.*; // HelloServer usar el servicio de nombrado. import org.omg.CosNaming.NamingContextPackage.*; // Excepciones especiales. import org.omg.CORBA.*; // Necesario para todas las aplicaciones CORBA. 6.1.2.- Declarando la clase del servidor Declaramos la clase del servidor: public class HelloServer { // Aqu ir el mtodo main. }

6.1.3.- Definiendo el mtodo main Declaramos un mtodo main estndar: public static void main(String args[]) { // Ponga aqu el bloque try-catch. } 6.1.4.- Manejando las excepciones CORBA Dado que todo programa CORBA puede lanzar excepciones en tiempo de ejecucin, usted debe poner toda la funcionalidad principal dentro de un bloque try-catch. Los programas CORBA lanzan excepciones en tiempo de ejecucin cuando ocurre algn problema durante alguno de los procesos que se llevan a cabo durante la invocacin de servicio remoto (marshaling, unmarshaling, upcall). El manejador de excepciones simplemente imprime la excepcin y la traza de la pila. De esta forma podremos saber qu cosa ha ido mal. Dentro del bloque try-catch escribiremos: try { // Aada el resto del cdigo del servidor aqu. } catch(Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); }

6.2.- Crear un objeto ORB Como un cliente, un servidor CORBA tambin necesita un objeto ORB local. Cada servidor instancia un ORB y regista sus objetos sirvientes para que el ORB pueda encontrar el seridor cuando recibe una peticin para l. En el fichero HelloServer.java, dentro del bloque try-catch, declaramos e inicializamos la variable ORB: ORB orb = ORB.init(args, null); La llamada al mtodo init del ORB le pasa los argumentos de la lnea de comando, permitindole establecer ciertas propiedades en tiempo de ejecucin.

6.3.- Administrando el Objeto Sirviente Un servidor es un proceso que instancia uno o varios objetos sirvientes. El sirviente implementa la interface generada por el programa idl2java y realiza el trabajo del interface. Nuestro HelloServer necesita un HelloServant. 6.3.1.- Instanciando el Objeto Sirviente Dentro del bloque try-catch, justo debajo de la llamada a init, instanciaremos el objeto sirviente: HelloServant helloRef = new HelloServant(); Esta clase sirviente no est definida an; lo haremos en el siguiente paso. Seguidamente conectaremos el sirviente al ORB, para que el ORB pueda reconocer las llamadas a ste y enviarlas al sirviente correcto: orb.connect(helloRef); 6.3.2.- Definiendo la Clase Sirviente Al final de HelloServer.java, fuera de la clase HelloServer, defina la clase para el objeto sirviente. Para ello declaramos la clase:

class HelloServant extends _HelloImplBase { // Aada aqu el mtodo sayHello. } El sirviente es una subclase de _HelloImplBase as que hereda la funcionalidad general CORBA generada por el compilador. Declare el mtodo sayHello: public String sayHello() { // Aada aqu la implementacin del mtodo. } Y escribimos la implementacin del mtodo: return "\nHello World!!\n"; El fichero HelloServer.java completo es el siguiente: import HelloApp.*; // El paquete que contienes nuestros stubs. import org.omg.CosNaming.*; // HelloServer usar el servicio de nombrado. import org.omg.CosNaming.NamingContextPackage.*; // Excepciones especiales. import org.omg.CORBA.*; // Necesario para todas las aplicaciones CORBA. public class HelloServer { public static void main(String args[]) { try{ // Crea e inicializa el ORB ORB orb = ORB.init(args, null); // Crea al sriviente y lo registra con el ORB HelloServant helloRef = new HelloServant(); orb.connect(helloRef); // Obtiene el contexto de nombrado raiz org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // Liga el objeto al nombrado NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; ncRef.rebind(path, helloRef); // Espera a peticiones de los clientes java.lang.Object sync = new java.lang.Object(); synchronized(sync){ sync.wait(); } } catch(Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } } } class HelloServant extends _HelloImplBase { public String sayHello() { return "\nHello world!!\n"; } }

6.4.- Trabajando con el Nombramiento COS El servidor HelloServer trabaja con el servicio de nombramiento para hacer disponibles las operaciones del sirviente a los clientes. El servidor necesita una referencia al nombre del servicio, de manera que pueda registrarlo y asegurarse que las peticiones del interface Hello son dirigidas a su objeto sirviente. 6.4.1.- Obteniendo el Contexto Inicial de Nombramiento En el bloque try-catch, bajo la instanciacin del sirviente, llamaremos a orb.resolve_initial_references para obtener una referencia al servicio de nombres: org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); La cadena NameService est definida para todos los ORBs de CORBA. Cuando usted pasa esa cadena, el ORB devuelve un contexto de nombramiento que es una referencia al servicio de nombres. 6.4.2.- Ajustando la Referencia a Objeto Como con todos las referencias a objetos CORBA, objRef es un objeto CORBA genrico. Para usarlo como un objeto NamingContext (Contexto de Nombrado), usted debe ajustarlo a su tipo adecuado. Aada la llamada para ajustarlo justamente debajo de la sentencia anterior: NamingContext ncRef = NamingContextHelper.narrow(objRef); Aqu vemos el uso de una clase de ayuda generada por idl2java, similar en su funcin a HelloHelper. El objeto ncRef es ahora del tipo org.omg.CosNaming.NamingContext y usted puede usarlo para acceder al servicio de nombrado y encontrar otros servicios. Eso lo haremos en el siguiente paso. 6.4.3.-Registrar el Sirviente en el Servidor de Nombres Justo debajo de llamada al ajuste, cree un nuevo miembro NameComponent: NameComponent nc = new NameComponent("Hello", ""); Esta instruccin establece el campo de identificacin de nc, el nuevo NameComponent, a "Hello" y el campo de tipo a una cadea vaca. Dado que el camino al objeto Hello tiene slo un elemento, crearemos un vector de un slo elemento de nc. El mtodo NamingContext.resolve necesita este vector para su trabajo: NameComponent path[] = {nc}; Finalmente, pasamos el camino y el objeto sirviente al servicio de nombramiento, ligando el objeto sirviente al identificador "Hello": ncRef.rebind(path, helloRef); Ahora, cuando el cliente llama a resolve("Hello") en el contexto inicial de nombramiento, el servicio de nombramiento devuelve un referencia al objeto sirviente Hello.

6.5.- Esperando a la peticin El servidor est preparado; simplemente necesita esperar a una peticin del cliente. Para hacer esto, introduzca el siguiente cdigo al final del bloque try-catch: java.lang.Object sync = new java.lang.Object(); synchronized(sync) { sync.wait(); } Esta forma de Object.wait hace que HelloServer permanezca vivo (aunque incativo) hasta que venga una peticin del ORB. Como esto est en el main, depus de que se complete y sayHello termine, el servidor esperar otra vez.

Una vez que tenemos todo escrito, pasemos a compilarlo y probarlo 7.- Compilando y ejecutando la aplicacin "Hello World" Esta seccin muestra como compilar y ejecutar tanto el servidor como el cliente que conjuntamente forman la aplicacin "Hello World".

7.1.- Compilando el Cliente Compilamos el fichero HelloClient.java: $ javac HelloClient.java HelloApp/*.java Debera aparecer el fichero HelloClient.class en el directorio del proyecto.

7.2.- Compilando el Servidor Compilamos el fichero HelloServer.java: $ javac HelloServer.java HelloApp/*.java Deberan aparecer los ficheros HelloServer.class y HelloServant.class.

7.3.- Ejecutando la Aplicacin Cliente/Servidor Desde una terminal, iniciamos el servidor de nombres de Java IDL: $ tnameserv -ORBInitialPort nameserverport Ntese que nameserverport es el puerto donde correr el servidor de nombres. Si usted no especifica este puerto, por defecto se elegir el 900. Si estamos en Unix hay que tener en cuenta que slo root puede ejecutar un proceso en un puerto menor que 1024. Por esta razn, recomendamos que se elija un puerto superior a 1024. Desde una seguna terminal iniciamos el servidor de Hello: $ java HelloServer -ORBInitialHost nameserverhost -ORBInitialPort nameserverport Ntese que nameserverhost es el host donde el servidor de nombres IDL est ejecutndose. Usted puede omitir -ORBInitialHost nameserverhost si el servidor de nombres est ejecutndose en la misma mquina que el servidor de Hello. Tambin puede omitir -ORBInitialPort nameserverport si el servidor de nombres se est ejecutando en el puerto asignado por defecto. Desde una tercera terminal ejecutamos el cliente de Hello: $ java HelloClient -ORBInitialHost nameserverhost -ORBInitialPort nameserverport Ntese que nameserverhost es el host donde el servidor de nombres IDL est ejecutndose. Usted puede omitir -ORBInitialHost nameserverhost si el servidor de nombres est ejecutndose en la misma mquina que el cliente de Hello. Tambin puede omitir -ORBInitialPort nameserverport si el servidor de nombres se est ejecutando en el puerto asignado por defecto. El cliente imprime la cadena que le enva el servidor: Hello world!! Recuerde parar tanto el proceso tnameserv como HelloServer despus de que el cliente termine satisfactoriamente.

Bien, ya es usted un experto en programacin CORBA en lenguaje Java. Ahora debe probar

También podría gustarte