Download I Objetivos.
Document related concepts
no text concepts found
Transcript
UNIVERSIDAD AUTONOMA METROPOLITANA UNIDAD IZTAPALAPA División de Ciencias Básicas e Ingeniería Departamento de Ingeniería Eléctrica Licenciatura en Computación “PROPUESTA DE UNA PLATAFORMA DE ESTUDIO DE LA ARQUITECTURA CORBA UTILIZANDO JAVA” Reporte de Proyecto Terminal Alumno: Christofer Bernardo Estebanez Ruiz Matrícula: 205317917 Asesor: Dra. Graciela Román Alonso 2010 1 • Índice. I Objetivos ............................................................................................................. 3 II Introducción ...................................................................................................... 3 III CORBA .............................................................................................................5 III.I Arquitectura........................................................................................5 III.II Lenguaje Java-IDL...........................................................................6 IV Propuestas de ejercicios básicos usando CORBA..........................................7 IV.I Aplicación de acceso local.................................................................. 7 IV.II Aplicación de acceso remoto.......................................................... 19 V Conclusiones..................................................................................................... 21 VI Referencias..................................................................................................... 21 VII Anexo 1 ......................................................................................................... 22 2 I Objetivos. 1. Estudiar la arquitectura de manejo de objetos distribuidos CORBA. 2. Construir una plataforma basada en Java, que permita el manejo mediante CORBA. II Introducción. Actualmente los sistemas distribuidos basados en objetos son una tecnología que es cada vez más utilizada en el desarrollo de aplicaciones. El tener las bases para construir aplicaciones que usan los recursos localizados en diversas computadoras abre el panorama para abordar diferentes problemáticas de la vida diaria. Modelos orientados a objetos. En un modelo orientado a objetos (OO), una aplicación distribuida es considerada como una colección de objetos autónomos especializados en diferentes funcionalidades, que existen independientemente en un sistema distribuido. Diversos objetos coordinan sus actividades y usan sus funcionalidades mediante rutinas explícitas de comunicación. Objetos comunicantes. Un objeto reúne atributos y métodos y cada uno de ellos tiene un estado interno, descrito por los valores de sus atributos. Un objeto puede ser accesado mediante la llamada a sus métodos (mensaje), los cuales pueden representar servicios para clientes o bien para modificar el estado interno del objeto. El modelo OO seguido se usa en el diseño de aplicaciones de granularidad gruesa de gran escala. Objetos distribuidos. Los objetos distribuidos son un modelo para la realización de la arquitectura Cliente/Servidor. Los objetos distribuidos siguen el modelo de memoria distribuida, permiten el paralelismo de tareas y una programación MPMD. 3 Cada interacción entre objetos sigue el patrón Cliente/Servidor. Sin embargo, la estructura de los sistemas de objetos distribuidos es peer-to-peer: los papeles de Cliente y Servidor pueden cambiar en el tiempo. Objetos = Unidades de distribución. Los objetos pueden ser de granularidad muy gruesa (productos vendidos por una empresa). Los objetos poderosos de granularidad gruesa son comúnmente conocidos como componentes. • Objeto. ◦ Término de lenguaje de programación. ◦ Enfatiza el encapsulamiento de datos y código. ◦ Se usa frecuentemente para entidades en un mismo programa. • Componente ◦ Término de ingeniería de software. ◦ Enfatiza la oportunidad de agrupar entidades en aplicaciones de gran escala. ◦ Existe independientemente, no existe un solo programa. Arquitectura de objetos distribuidos. Las aplicaciones a gran escala generalmente de organizan como sistemas de software abiertos: los objetos pueden ser añadidos, modificados o retirados mientras el resto del sistema sigue corriendo. Sistemas como CORBA y DCOM proveen un conjunto de facilidades para el desarrollo de aplicaciones de gran escala (frameworks, dessign patterns, business objects, beans, etc.) 4 III CORBA III.I Arquitectura CORBA. CORBA (Common Object Request Broker Architecture) es un estándar establecido por la OMG (Object Management Group: http://www.omg.org/). CORBA se diseñó para funcionar sobre ambientes heterogéneos y permite la interoperabilidad entre programas escritos en diferentes lenguajes de programación y entre programas que corren en diferentes máquinas. Existe una clara separación entre interfaz e implementación de servicio. • ¿Qué es? CORBA es sólo una especificación para crear y usar objetos distribuidos. • ¿Qué no es? CORBA no es un lenguaje de programación. Un sistema basado en CORBA es una colección de objetos que aislan a los solicitantes de servicios (clientes) de los provedores de servicio (servidores) por una interfaz de encapsulamiento bien definida. • • • Los objetos de CORBA pueden correr en cualquier plataforma. Los objetos de CORBA pueden ser localizados en cualquier parte de la red. Los objetos de CORBA pueden ser escritos en cualquier lenguaje que tenga mapeo IDL. La Object Management Architecture (OMA) de OMG define varios servicios de alto nivel para el cómputo distribuido orientado a objetos. El núcleo de OMA es el Object Request Broker (ORB) que es un mecanismo que provee transparencia en la localización de objetos, comunicación y activación. Cualquier programa existente puede ser transformado a un objeto CORBA al describir su interfaz mediante un lenguaje de definición de interfaces (IDL). Transparencia de localización. El propósito del ORB es mediar la comunicación entre los objetos Cliente y Servidor de manera transparente. Un objeto tiene asociado un identificador único (o referencia única de objeto), asignado automática mente por el sistema. Un Cliente no conoce la localización física del Servidor por lo que envía la petición al ORB el cual busca la localización del Servidor y envía la petición del Cliente. 5 CORBA (Common Object Request Broker Architecture). Servidor Operación Cliente Implementación de objeto Resultad o DII Stubs Interfaz ORB Interfaz ORB Skeletons DSI Adaptador de objeto Deposito de implement. III.II Lenguaje Java-IDL. Interface description language (también lenguaje de descripción de interfaces). Es un lenguaje de informática utilizado para describir la interfaz de componentes software. Describe una interfaz en un lenguaje neutral, lo cual permite la comunicación entre componentes de software desarrollados en diferentes lenguajes como por ejemplo, entre las componentes escritas Java. Son utilizadas con frecuencia en el software de las llamadas a procedimiento remoto (RPC), lo que permite a los sistemas de computadoras utilizar lenguajes y sistemas operativos diferentes. IDL ofrece un puente entre dos sistemas diferentes. El compilador IDL usa el mapeo del lenguaje IDL-a-Java para convertir las definiciones de interfaz IDL a las correspondientes interfaces, clases y métodos de Java, los cuales pueden ser usados para implementar el código cliente-servidor. 6 IV Propuestas de ejercicios básicos usando CORBA: “Hola mundo” con tecnología JavaIDL. IV.I Aplicación de acceso local. Antes de empezar: Para Windows: Se debe contar previamente con la versión 1.4 de J2SE (Java 2 Standard Edition) que contiene la Interfaz de Programación de Aplicación (API por sus siglas en inglés) y el Intermediario de Petición de Objetos (ORB por sus siglas en inglés) los cuales son necesarios para habilitar la interacción de objetos distribuidos basados en CORBA, así como el compilador IDL. Para Linux: Para poder usar los comandos de conexión remota (orbd) basta con instalar la máquina virtual de Java en el sistema operativo la cual ya cuenta con el compilador IDL y con el protocolo correspondiente que permite habilitar la interacción de objetos distribuidos. Una vez visto esto procederemos a la creación y ejecución del programa. 7 • Escribiendo el archivo hello.idl. 1. Crear un nuevo directorio llamado Hello para esta aplicación. 2. En un archivo de texto escribir el código: module HelloApp{ interface Hello{ string sayHello(); oneway void shutdown(); }; }; 3. Guardar el archivo como Hello.idl. • Entendiendo el archivo idl. El idl para nuestro “hola mundo” es extremadamente sencillo ya que su interfaz tiene solo dos operaciones. Solo se necesitan tres pasos a realizar: 1. Declaración del modulo CORBA IDL. Un módulo CORBA es un nombre-espacio que actúa como contendor para las interfaces y declaraciones relacionadas. Se asemeja a un paquete Java. Cada declaración de módulo en un archivo IDL es mapeado a un paquete Java. La declaración del módulo luce así: module HelloApp{ // Resto de las líneas del código }; Cuando se compila el IDL, la declaración del módulo generará una declaración de paquete en el código de Java. 2. Declaración de la interfaz. Así como las interfaces Java, las interfaces CORBA declaran la relación que un objeto tiene con otros objetos. Cada declaración de interfaz en IDL mapea la declaración de interfaz de Java. 8 Para nuestro archivo Hello.idl, la declaración de interfaz luce así: module HelloApp{ interface Hello{ }; }; Cuando se compila el IDL, esta declaración generará una declaración de interfaz en el código de Java. 3. Declarando las operaciones. Las operaciones de CORBA son el comportamiento que el servidor promete cumplir por los clientes que lo invoquen. Cada declaración de operación en IDL genera una declaración de método correspondiente en el que es generado en la interfaz Java. En nuestro archivoHello.idl, la declaración de operaciones luce así: module HelloApp{ interface Hello{ string sayHello(); oneway void shutdown(); }; }; La definición de interfaz para nuestra aplicación “hola mundo” ahora está completa. • Mapeo del archivo Hello.idl a Java. La herramienta idlj lee los archivos IDL y crea los archivos Java requeridos. El compilador idlj genera por defecto solo las obligaciones del lado del cliente. Si se necesitan las obligaciones del lado del cliente y los esqueletos del lado del servidor (como ocurre en este caso), debes usar la opción –fall cuando ejecutes el compilador idlj. Dentro del directorio de ubicación del archivo Hello.idl escribir en la línea de comandos: idlj -fall Hello.idl Esto crea un directorio llamado HelloApp que contiene seis archivos *.java. 9 • Entendiendo la salida del compilador idlj. El compilador idlj genera un cierto número de archivos. Este número depende de las opciones seleccionadas cuando el archivo IDL es compilado. Los archivos generados proveen una funcionalidad estándar, así que pueden ser ignorados hasta el momento en que hay que desplegar y ejecuta el programa. Los archivos generados son: HelloPOA.java. Esta clase abstracta es el esqueleto del servidor de conexión base la cual provee al servidor de la funcionalidad CORBA básica. _HelloStub.java. Esta clase es el talón del cliente, el cual provee al cliente de la funcionalidad CORBA. Hello.java. Esta interfaz contiene la versión Java de nuestra interfaz IDL. HelloHelper.java. Esta clase provee funcionalidad auxiliar, en particular el método narrow() requerido para convertir las referencias de objeto CORBA a los tipos apropiados. HelloHolder.java. Esta clase final posee un miembro de instancia pública del tipo Hello. En el momento en que el tipo IDL es un parámetro out o inout, la clase Poseedor es usada. HelloOperations.java. Esta interfaz contiene los métodos sayHello() y shutdown(). El mapeo IDL-a-Java pone todas las operaciones definidas en la interfaz en este archivo. Cuando se escribe la interfaz IDL, se hace toda la programación requerida para generar todos estos archivos para la aplicación distribuida. 10 • Desarrollo del servidor. Creación de HelloServer.java. 1. Abrir un editor de texto y crear un archivo llamado HelloServer.java dentro del directorio Hello. 2. Escribe el siguiente código en el archivo: import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; import org.omg.PortableServer.POA; import java.util.Properties; class HelloImpl extends HelloPOA{ private ORB orb; public void setORB(ORB orb_val){ orb = orb_val; } public String sayHello(){ return "\nHello world !!\n"; } public void shutdown(){ orb.shutdown(false); } } public class HelloServer{ public static void main(String args[]) { try{ ORB orb = ORB.init(args, null); POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); HelloImpl helloImpl = new HelloImpl(); helloImpl.setORB(orb); org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String name = "Hello"; 11 NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); orb.run(); }catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } System.out.println("HelloServer Exiting ..."); } } 3. Guarda y cierra HelloServer.java. • Entendiendo HelloServer.java. La estructura del programa servidor CORBA es el mismo que el de la mayoría de las aplicaciones Java: se importan paquetes de librerías requeridos, se declara la clase del servidor, se define main() y se manejan las excepciones. Importando los paquetes requeridos: import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; import org.omg.PortableServer.POA; Definiendo la clase servidor: En este ejemplo estamos definiendo la clase para el objeto servidor dentro de HelloServer.java pero fuera de la clase HelloServer. class HelloImpl extends HelloPOA{ // Los métodos sayHello() y shutdown() van aquí } El servidor es una subclase de HelloPOA así que hereda la funcionalidad CORBA general generada por el compilador. Ahora, creamos una variable privada orb que es usada en el método setORB(ORB). Este en un método privado definido por la aplicación desarrolladora para que el valor ORB pueda ser fijado con el servidor. Este valor ORB es usado para invocar el método shutdown() en respuesta a la invocación del método shutdown() del cliente. 12 private ORB orb; public void setORB(ORB orb_val){ orb = orb_val; } Después declaramos e implementamos el método sayHello() requerido: public String sayHello(){ return "\nHello world!!\n"; } Por último, implementamos el método shutdown() de forma similar: public void shutdown(){ orb.shutdown(false); } Declarando la clase del servidor: public class HelloServer{ // El método mai() va aquí } Definiendo el método main(): Cada aplicación de Java necesita de un método main() y es declarado dentro de la clase HellServer. public static void main(String args[]{ // Aquí va el código try-catch } Manejando las excepciones del sistema CORBA. Como todos los programa CORBA pueden arrojar excepciones de sistema CORBA en tiempo de ejecución, toda la funcionalidad de main() es colocada dentro de un bloque trycatch. Los programa CORBA arrojan excepciones en tiempo de ejecución cuando ocurre un problema durante algún proceso envuelto en una invocación. El manejador de excepciones simplemente imprime la excepción y el rastro de su pila en una salida estándar para poder ver que fue lo que ocurrió mal. El bloque try-catch se coloca dentro de main() como se muestra: try{ // El resto del código HelloServer va aquí. }catch(Exception e){ System.err.println("ERROR: " + e); e.printStackTrace(System.out); } 13 • Compilando el servidor “hola mundo”. Ahora ya podemos compilar HelloServer.java para corregir cualquier error antes de continuar. 1. Posicionarse en el directorio Hello. 2. Ejecutar el compilador Java sobre HelloServer.java: Javac HelloServer.java HelloApp/*.java 3. Corregir los errores y recompilar si es necesario. 4. Se generan los archivos HelloServer.class y HelloImp.class en el directorio Hello. 14 • Desarrollo del cliente. Creación de HelloClient.java. 1. Abrir un editor de texto y crear un archivo llamado HelloClient.java dentro del directorio Hello. 2. Escribe el siguiente código en el archivo: import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; public class HelloClient{ static Hello helloImpl; public static void main(String args[]){ try{ ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String name = "Hello"; helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); System.out.println("Obtained a handle on server object: " + helloImpl); System.out.println(helloImpl.sayHello()); helloImpl.shutdown(); } catch (Exception e) { System.out.println("ERROR : " + e) ; e.printStackTrace(System.out); } } } 3. Guarda y cierra HelloServer.java. • Entendiendo HelloClient.java. El caparazón básico de un cliente CORBA es el mismo que el de muchas de las aplicaciones Java: se importan paquetes de librerías requeridos, se declara la clase del servidor, se define main() y se manejan las excepciones. 15 Importando los paquetes requeridos: import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; Definiendo la clase cliente: Lo siguiente es declarar la clase del cliente: public class HelloClient{ // El método main() va aquí } Creando el objeto ORB. Un cliente CORBA necesita un objeto ORB local para desempeñar su cálculo de referencias y su trabajo IIOP. La variable ORB es declarada e inicializada dentro del bloque try-catch: ORB orb = ORB.init(args,null); La llamada al método init() de CORBA pasa los argumentos de la línea de comando en la aplicación, permitiendo fijar ciertas propiedades en tiempo de ejecución. Buscando el servidor Hello. Ahora que la aplicación tiene un ORB, puede pedirle que localice el servicio que necesita, en este caso el servidor Hello. Para ello, nuestra aplicación cliente usará el servicio de nombramiento COS. Obteniendo el contexto de nombramiento inicial. El primer paso para usar el servicio de nombramiento es obtener el contexto de nombramiento inicial: org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); Estrechando la referencia del objeto. Como en todas las referencias a objeto CORBA, objRef es un objeto CORBA genérico. Para poder usarlo como un objeto NamingContextExt, se debe estrechar al tipo apropiado. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 16 Aquí vemos el uso de una clase de ayuda generada por idlj, similar a la función HelloHelper. Resolver la referencia a objeto en el nombramiento. Para publicar una referencia en el servicio de nombrado hacia el objeto Hello que implementa la interfaz Hello, necesitas primero una cadena identificadora para el objeto Hello: String name = "Hello"; Finalmente pasamos name al método resolve_str() del servicio de nombrado para obtener una referencia objeto para el servidorHello y estrecharlo al objeto Hello: helloImpl = HelloHelper.narrow(ncRef.resolve-str(name)); System.out.println("Obtained a handle on server object: " + helloImpl); Aquí se ve a la clase de ayuda HelloHelper trabajar. El método resolve_str() regresa un objeto CORBA genérico. Por lo tanto, inmediatamente se estrecha el objeto Hello, el cual es la referencia objeto que se necesita para realizar el resto del trabajo. Invocando la operación sayHello(). Las invocaciones CORBA son una llamada a método sobre un objeto local.Finalmente, imprimimos los resultados de la invocación a una salida estándar y se apaga el ORB: System.out.println(helloImpl.sayHello()); helloImpl.shutdown(); • Compilando el servidor “hola mundo”. Ahora ya podemos compilar HelloClient.java para corregir cualquier error antes de continuar. 1. Posicionarse en el directorio Hello. 2. Ejecutar el compilador Java sobre HelloClient.java: Javac HelloClient.java HelloApp/*.java 3. Corregir los errores y recompilar si es necesario. 4. Se genera el archivo HelloClient.class en el directorio Hello. 17 • Ejecución de la aplicación “hola mundo”. 1. Iniciar el orbd. Desde terminal Linux: rbd -ORBInitialPort 1050 -ORBInitialHost localhost& Desde terminal Windows: start orbd -ORBInitialPort 1050 -ORBInitialHost localhost NOTA: 1050 es el puerto en el cual se quiere ejecutar el servidor. Para poder ejecutar la aplicación en un puerto en un puerto menor a 1024 se debe ser el administrador del sistema, por eso es que se ejecuta en un puerto mayor a 1024. 2. Iniciar el servidor Hello: Desde terminal Linux: java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost& Desde terminal Windows: start java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost 3. Ejecutar la aplicación cliente java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost • El cliente imprime la cadena desde el servidor en la línea de comandos. Hello world !! 18 IV.II Aplicación de acceso remoto. Cliente Implementación del objeto Cliente Implementación del objeto IDL IDL IDL IDL ORB ORB RED Para poder ejecutar la aplicación “hola mundo” en dos máquinas se debe colocar al cliente, los esbozos y los esqueletos en la máquina del cliente y el servidor en la máquina del servidor. 1. Crear (como se muestro previamente) y compilar el archivo Hello.idl en la máquina del cliente: idlj -fall Hello.idl 2. Crear el archivo HelloClient.java en la máquina del cliente. Compilar los archivos java, incluyendo los esbozos y los esqueletos (que se encuentran en el directorio HelloApp): javac *.java HellApp/*.java 3. Crear el archivo HelloServer.java en la máquina del servidor. Compila los archivos *.java. javac *.java 4. Inicia el demonio intermediario de petición de objets Java (orbd por sus siglas en ingles), el cual incluye el servicio de nombramiento. 19 Para hacer esto en Linux: orbd -ORBInitialPort 1050 -ORBInitialHost direcciónIP& Para hacer esto en Windows: start orbd -ORBInitialPort 1050 -ORBInitialHost direcciónIP Los argumentos -ORBInitialPort y -ORBInitialHost son obligatorios para la línea de comando orbd. En este ejemplo se usa el puerto 1050. NOTA: La dirección IP del servidor fue generada por medio de un simulador de redes virtuales, Hamachi en este caso, la cual es una es una aplicación configuradora de redes privadas gratuita capaz de establecer vínculos directos entre computadoras que están bajo firewalls de NAT sin requerir reconfiguración alguna (en la mayoría de los casos). En otras palabras, establece una conexión a través de Internet y simula una red de área local formada por ordenadores remotos. 5. Inicia el servidor Hello en la máquina del servidor como se muestra: En la terminal de Linux: java HelloServer -ORBInitialPort 1050& En terminal de Windows: start java HelloServer -ORBInitialPort 1050 Nota: No se necesita especificar el argumento -ORBInitialHost porque el servidor Hello estará ejecutándose en el mismo anfitrión que el servidor en este ejemplo. 6. Ejecuta la aplicación Hello del cliente en la maquina donde se encuentra el cliente: En terminal de Linux: java HelloClient -ORBInitialHost direcciónIP -ORBInitialPort 1050& En terminal de Windows: java HelloClient -ORBInitialHost direcciónIP orbd -ORBInitialPort 1050 Nota: La direcciónIP es el anfitrión en el cual el servidor IDL está ejecutándose. En este caso es la máquina del servidor. 7. Detener el orbd cuando se termine la aplicación, en caso contrario el servidor seguirá esperando invocaciones del cliente. 20 V Conclusiones. Java IDL es una tecnología para objetos distribuidos que permite la interacción de estos sobre diferentes plataformas a través de la red. Esta interacción es posible porque Java-IDL está basada en una arquitectura de intermediario de peticiones de objetos comunes (CORBA), un modelo de objetos distribuidos estándar. El compilador IDL es una herramienta poderosa y de gran ayuda para la creación de aplicaciones de objetos distribuidos; una vez que se tiene definida la interface remota se puede de forma relativamente sencilla crear aplicaciones, ya que la conexión entre clienteservidor se realiza de la misma forma en todas las aplicaciones, es decir, no cambia el código de conexión en la aplicación de servidor. Parte del poder de alcance de CORBA se debe al apoyo del compilador IDL, quien es el encargado de la creación de todo el “esqueleto” de nuestras aplicaciones y al soporte que proporciona Java, comenzando por las clases (que son compatibles con el lenguaje IDL), pasando por los métodos de manipulación hasta el manejo de excepciones. Por ello se propone utilizar esta plataforma para el desarrollo de aplicaciones Java-IDL ya que su manejo es simple (como puede verse en este documento) para la creción de las mismas. VI Referencias. ◦ ORBIX de IONA Technologies. http://www.iona.com/products/orbix/ ◦ VisiBroker de Borland. http://www.borland.com/us/products/visibroker/ ◦ JacORB is an object request broker written in Java, available under the LGPL. http://www.jacorb.org/ ◦ JavaIDL de JavaSoft. http://java.sun.com/products/jdk/idl ◦ Información sobre el compilador IDL. http://es.wikipedia.org/wiki/IDL ◦ Información sobre Hamachi. http://es.wikipedia.org/wiki/Hamachi 21 VII Anexo 1. Otra aplicación para la arquitectura CORBA usando tecnología JavaIDL. ◦ Implementador de fechas. Código del archivo IDL: module FechaApp { interface Fecha{ string getFecha(); }; }; Código del servidor: import FechaApp.*; import org.omg.CORBA.*; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.POA; import java.util.*; import java.io.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; class FechaImpl extends FechaPOA { public String getFecha() { return (new Date()).toString(); } } public class FechaServer { public static void main(String args[]) { try { ORB orb = ORB.init(args, null); FechaImpl impl = new FechaImpl(); POA rootpoa=POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); org.omg.CORBA.Object ref = rootpoa.servant_to_reference(impl); 22 Fecha href = FechaHelper.narrow(ref); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String nombre = "Fecha"; NameComponent path[] = ncRef.to_name(nombre); ncRef.rebind(path, href); orb.run(); }catch (Exception e) { System.err.println("ERROR: " + e); } } } Código del cliente: import FechaApp.*; import org.omg.CORBA.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; public class FechaClient { public static void main(String args[]) { try { ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef =orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String nombre = "Fecha"; Fecha impl = FechaHelper.narrow(ncRef.resolve_str(nombre)); System.out.println("Fecha: " + impl.getFecha()); }catch (Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); } } } 23