Download Unidad: Iztapalapa División: Ciencias Básicas e

Document related concepts
no text concepts found
Transcript
Casa abierta al tiempo
UNIVERSIDAD A U T ~ N O M AMETROPOLITANA
Unidad: Iztapalapa
División: Ciencias Básicas eIngeniería
Carreras:
Ingeniería en Electrónica
Licenciatura en Computación
Materia: Proyecto terminal I1
Título: Sistema cooperativo enJava
Fecha: Septiembre de 1999
Alumnos:
David FloresVelázquez
9222 1468
Asesor: Ing. Victor Manuel Ramos Ramos
Sisterria Cooperativo en Java
Flores Velázquez David
Solano Suárez Humberto
Univers'idad Autónoma Metropolitana
Iztapalapa
Contenido
Prefacio
iv
Introducción
vi
1 Objetivos
1
2 Fundamentos
2.1 Análisis y Diseño Orientado a Objetos . . . . . . . . . . . . . . .
2.2 Programación Distribuida . . . . . . . . . . . . . . . . . . . . . .
2.3 Comunicacióncon RPC (Remote Procedure Call) . . . . . . . . .
2.4 CORBA (CommonObject RequestBroker Architecture) . . . . .
2.4.1 IDL (Interface Definition Language) . . . . . . . . . . . .
2.4.2 ORB (Object Request
Broker)
...............
2.4.3 ORB en el servidor . . . . . . . . . . . . . . . . . . . . . .
2.4.4 ORB en el cliente . . . . . . . . . . . . . . . . . . . . . . .
2.5
RMI
(Remote Method Invocation) . . . . . . . . . . . . . . . . .
2.5.1
Nivel
stub/skeleton . . . . . . . . . . . . . . . . . . . . . .
2.5.2Nivel
de referencia remota . . . . . . . . . . . . . . . . . .
2.5.3 Nivel de transporte . . . . . . . . . . . . . . . . . . . . . .
2.5.4 Interfazdel objetoremoto . . . . . . . . . . . . . . . . . .
2.5.5 Implementación enelservidor
. . . . . . . . . . . . . . . .
2.5.6 El registro RMI . . . . . . . . . . . . . . . . . . . . . . . .
2.5.7 Stub delcliente y skeletondel servidor . . . . . . . . . . .
2.6
Serialización
de
objetos
.......................
2.7 AWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2
10
10
10
11
11
11
14
15
3 Modelo de la Aplicación
3.1 Funcionalidad ofrecida . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Jerarquíade Clases . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.2
Servidor
............................
16
16
16
16
28
3
4
5
6
7
7
8
8
9
4
Funcionamiento del Sistema
45
5
Conclusiones
50
i
Lista de Tablas
3.1
3.2
3.3
3.4
3.5
3.6
3.7
Clases y
Clases y
Clases y
Clases y
Clases y
Clases y
Clases y
Métodos del sistema . . . . . . . . . . . . . . .
MCtodos del sistema(Continuaci6n) . . . . .
Métodos del sistema(Continuaci6n). . . . .
Métodos del sistema(Continuaci6n) . . . . .
Métodos del sistema(Continuaci6n). . . . .
Métodos del sistema(Continuaci6n) . . . . .
Métodos del sistema(Continuaci6n) . . . . .
11
......
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
.......
.......
38
39
40
41
42
43
44
Lista de Figuras
2.1 Petición local y remota . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Interacción cliente .servidor . . . . . . . . . . . . . . . . . . . . .
2.3 Arquitecturadecapasde
RMI . . . . . . . . . . . . . . . . . . . .
5
6
9
3.1
3.2
3.3
3.4
3.5
3.6
Jerarquíade clasesdel cliente . . . . . . . . . . . . . . . . . . . . .
Jerarquía de clasesdel servidor . . . . . . . . . . . . . . . . . . . .
Clases relacionadas con DrawApplication. . . . . . . . . . . . .
Clases relacionadas con TextApplication . . . . . . . . . . . . . .
Clases relacionadas con la claseAdressDialog . . . . . . . . . . .
Clases que sirven para crear los dibujos y el texto . . . . . . . .
.
.
.
.
17
29
33
35
36
37
4.1
4.2
4.3
4.4
4.5
Ventanade iniciodelcliente . . . . . . . . . . . . . . . . . . . . .
Ventana de información del usuario . . . . . . . . . . . . . . . . .
Ventana para el intercambio de mensajes . . . . . . . . . . . . . .
Ventanadetexto . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ventanadedibujo . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
46
47
48
49
...
111
Prefacio
Las razones que hacen interesante la idea de trabajar en un Proyecto Terminal
son la posibilidad de vincular los conocimientos adquiridos a lo largo de la
carrera de Electrónica y Computación, así como extender estos conocimientos en
un área que permita obtener una visión distinta del trabajo en red. El presente
trabajo habla de un Sistema que permite a un grupo de personas trabajar de
manera conjunta y organizada sin necesidad de estar enel mismo sitio para
expresar sus ideas y desarrollar su trabajo. Esto puede conseguirse a través de
una red de computadoras(por ejemplo Internet), en donde se puede trabajar
en un documento (que puede ser de texto, dibujos, o archivos de algún otro
tipo) y observar de manera inmediatalos cambios que cada una de las personas
hace sobre el documento, elhecho de trabajar vía Internet implica que los
usuarios pueden encontrarse en cualquier parte del mundo; a un sistema con las
características descritas se le denomina Sistema Cooperativo. Pero no sólo es
eso lo interesante, sino poder entender qué es lo que hay detrás de este sistema y
que permite dicho comportamiento, así como entender la utilidad y los alcances
del sistema para un trabajo en grupo de manera organizada.
A lo largo de esta exposición se explicará cuáles son los elementos que
hacen posible dicho sistema y cuáles son las razones por las que se utilizan las
herramientas para el diseño e implementación.
En el capítulo 1 se presentan las objetivos que este trabajo persigue y la
forma en que se distribuye dicho trabajo.
Para el capítulo 2 se da una breve explicación de los conceptos necesarios
para el desarrollo del sistema.
En el capítulo 3 se comienza a dar el modelo generado para el sistema, así
como su implementación.
En el capítulo 4 se muestran lascaracterísticas del sistemay su funcionamiento.
Por ultimo en el capítulo 5 pueden encontrarse a
ls conclusiones de este
trabajo.
Ya existe el modelo fundamental para este Sistema y una primera aplicación, el siguiente paso es pensar en una extensión delmodelo que consiga
hacerlo más variado y por lo mismo útil. No es el objetivo de este trabajo
extender la primera aplicación sino hacer una segunda.
AI concluir la presentación del sistema podrá disponerse del código fuente
en una página en Internet que será señalada más adelante esto con la intención
iv
de proporcionar a los interesados la oportunidad de evaluar, corregir, modificar
o extender el sistema.
V
Introducción
Se puede hablar de un Sistema Cooperativo como una aplicación de 10s Sistemas Distribuidos. Este sistema pretende dar la apariencia de un documento
centralizado sobre el cual una o más personas trabajan en tiempo real(1a actualización del documento debe ser rápida para aparentar esto), lo que permite ver
los cambios que cada persona realiza sobre el documento en el momento que se
hacen. La realidad es que cada una de las personas tiene en su computadora
una copia del documento y el sistema se encarga de hacer las actualizaciones correspondientes sobre cada uno de los documentos. El sistema permite al usuario
saber cuales son los grupas de trabajo que ya existen o crear su propio grupo
de trabajo. Ya dentro del sistema se puede saber quienes son los usuarios que
se encuantran trabajando en ese momento.
Existen sistemas comerciales que poseen las características antes mensicnadas (como Netmeeting de internet explorer o Netscape Conference) aparte
de un conjunto de carcaterísticas adicionales que los hacen muy utiles para la
comunicación escrita o visual.
Para poder conseguir lo anterior es necesario entender lo que una aplicación
distribuida significa así como los requerimientos para trabajar en un ambiente
Cliente/Servidor.
Java fue el lenguaje de programación elegido para la implementación del
sistema ya que el modelo es orientado a objetos y el lenguaje permite implementar un modelo con esa característica.
Otras de las ventajas de Java son la funcionalidad que ofrece para un desarrollo sencillo de un ambiente gráfico, así como su mecanismo de interconectividad que es RMI y que hace sumamente sencilla y segura la comunicación a
través de una red.
L a primera aplicación denominada FirstAplication permite trabajar con
texto con las características citadas al inicio de la introducción, no es nuestra
intensión presentar esta aplicación pero si hacer una descripción de lo que será
la extensión del sistema creando una segunda aplicación con las mismas características de funcionamiento pero con una utilidad distinta que permitirá crear
y editar objetos gráficos y texto.
vi
Capítulo 1
Objetivos
El proyecto está dividido en dos partes.
perseguidos son:
En la primeraparte
los objetivos
o
Presentar aspectos fundamentales del paradigma orientado a objetos que
permitan entender los modelos y conceptos, expuestos mas adelante.
o
Entender los fundamentos de un Sistema Distribuido.
o
Conocer alternativas para la interconectividad como son RPC y CORBA
y realizar una comparación con RMI.
o
Conocer y trabajar con Java.
Los objetivos para la segunda fase del proyecto son:
o
Diseñar y presentar el modelo de lo que será la nueva aplicación.
e
Definira
ls características específicas del sistema y la funcionalidad que
&te ofrece.
1
Capítulo 2
Fundamentos
2.1
Análisis y Diseño Orientado a Objetos
La utilización del paradigma orientado a objetos ofrece ventajas como la abstracción que permite ladescomposición de la complejidad de los sistemas, encontrando patrones comunes de comportamiento entre los elementos de un sistema
específico. Esto permite agrupar adichos elementos en lo que se denomina como
clases que se pueden pensar como un modelo o la especificación de características
y comportamiento del objeto que la clase está modelando. Al hablar de un objeto nos referimos a una instancia de la clase, cada objeto creado de una clase
tendrá un comportamiento, estado e identidad que le permitirá ser distinguido
de los demás. La definici6n de clases resulta subjetiva porque depende del interés del individuo que quiere describir y modelar al sistema. Pensando en una
red de comunicaciones como un sistema puede ser diferente el modelo que un
ingeniero propone del que un usuario puede proponer, pues este último sólo se
preocupa por los serviciosque la red ofrece mientras que el ingeniero deberá preocuparse por todos los elementos relacionados. Un buen grado de abstracción
permite identificar las jerarquías y relaciones entre los objetos para entender
el funcionamiento del sistema de forma más adecuada, también permitirá extender el sistema agregando características nuevas sin muchas dificultades, se
podrá hablar de unaevolución del sistema y de la reutilización de elementos [l].
Como ejemplo se tiene al sistema cooperativo que pretende poder comunicar a uno o varios clientes con un servidor que se encargará de ofrecer diferentes servicios como la comunicación entre los usuarios. Lo que nos interesa en
este caso son tanto las propiedades como el comportamiento del los elementos de
este sistema. Al pensar en un comportamiento común entre los objetos podemos
pensar en que cada cliente desarrolla el mismo comportamiento aunque pueden
encontrarse, cada uno, en distintos estados y tener diferentes identidades que
permitirán distinguirlos, esto puede permitir definir una clase de tipo Cliente.
Si por ejemplo el cliente necesita crear una ventana para su área de trabajo
y ya existe una clase ventana que cuenta tal vez no con todas pero sí con la
2
mayoría de las características que se requieren se puede crear una nueva clase
ventana que tome las características de la clase ventana inicial y que además
agregue características nuevas, con esto estamos utilizando una característica
de la programación orientada a objetos llamada herencia.
Otro aspecto interesante que se puede hacer es crear una clase que defina
el comportamiento de lo que un objeto debe tener sin implementar este comportamiento, a esto se le llama interface y tiene como finalidad que la persona
implemente el comportamiento de la forma que más le convenga.
Gracias a la herencia puede definirse para una clase servidor un comportamiento inicial sabiendo 'que se puede evolucionar a la clase servidor de una
manera sencilla y sin hacer grandes cambios; se está reutilizando lo que ya existía. Desde luego tanto el cliente como el servidor en general pueden constar
de varias clases. Lo que se puede hacer es agrupar estas clases dando como resultado lacreación de un módulo, con esto se puede conseguir que la estructura
de cada módulo sea lo bastante simple para ser comprendida en su totalidad,
a lo anterior se le denomina modularidad, cada uno de estos módulos debe ser
débilmente acoplado, es decir no debe ser dependiente de otros módulos porque
esto generaría problemas para la reutilización de elementos. En el caso de las
relaciones entre objetos se define la relación de enlace para la cual el paradigma
define la comunicación enhe objetos que no es más que el paso de parámetros
entre ellos o la utilización lde los métodos de un objeto por otro. La relación de
agregación se refiere a la contención de un objeto en otro, de forma explícita se
puede encontrar la declaración de una clase dentro de otra. Un ejemplo sería
crear una clase botón y una clase ventana que siempre necesite de botones,
entonces se puede definir a la clase botón dentro de la clase ventana.
2.2
Programación Distribuida
Los siguientes conceptos son comunes para los temas de programación distribuida citecomputing y ,se hará uso de ellos a lo largo de este trabajo:
o
Marshal: Es la tarea, de empacar los argumentos de un método para entregarlos al objeto remoto y la tarea de recoger los valores regresados por
el método para el cliente [a].
o
Skeleton: Es la interfaz entre la implementación del objeto remoto y el
administrador de objetosdel lado del servidor y es usado para crear nuevas
instancias de la clase y para conducir las llamadas de métodos remotos a
l a implementación del objeto.
o
Stub: Es una interfa,z del cliente para clase de objetos y es usado por el
cliente para conducir las transacciones al objeto en el servidor.
3
2.3
Comunicación con RPC (Remote Procedure
Call)
La Llamada a Procedimientos Remotos (RPC en inglés) permite a un cliente
ejecutar procedimientos en otra computadora en la red o servidor remoto. El
término remoto no necesariamente significa que el cliente y el servidor se están
comunicando a través de la red; de hecho, pueden ambos existir en la misma
máquina. La diferencia entre llamada a procedimientos local y remoto es que
enel primer caso el cliente ejecuta el proceso en su propio espacio de direccionamiento y en la segunda el cliente y el servidor se ejecutan como dos procesos separados. La biblioteca de RPC maneja la comunicación entre estos dos
procesos. RPC utiliza un modelo de comunicación petición - respuesta [3]. El
cliente envía un mensaje de petición al servidor el cual regresa un mensaje de
respuesta. La comunicación entre el cliente y el servidor se lleva a cabo por
medio de dos stubs uno del lado del cliente y otro del lado del servidor. Aquí
puede verse una diferencia entre RMI y RPC ya que el primero no utiliza dos
sino sólo un stub que está del lado del cliente y un skeleton del lado del servidor.
En RPC un stub se define como una interface que implementa el protocolo de
RPC y especifica como serán construidos e intercambiados los mensajes. Los
stubs son generados por medio de un compilador que los liga al cliente y al
servidor.
En la figura 2.1 puede verse cómo se ejecutan una petición local y una
remota. El cliente hace una petición al servidor pasando argumentos y el servidor responde a la petición enviando resultados al cliente. En el diagrama de la
izquierda la comunicación es bastante simple, y en el diagrama de la derecha
el cliente y el servidor se valen cada uno de su propio stub para efectuar la
comunicación y los stubs utilizarán el transporte de red para comunicarse entre
ellos y dar la petición o entregar resultados a quien corresponde.
La utilización de IPC (Interprocess Communications) es esencial para el
modelo cliente-servidor, el problema es que su utilización resulta poco fácil pero
con la utilización de RPC! menos laborioso, también se evita la necesidad de
trabajar a bajo nivel. En RPC en general, losservicios se encuentranala
espera de una petición de conexión, el servicio puede dar al cliente la dirección
que necesita para abrir el canal de comunicación con el servidor. El servidor
puede entonces aceptar la petición (o denegarla) enviando la respuesta necesaria.
El servidor debe indicar al registro de puertos en que puerto estará ubicado para
que cuando el cliente haga la petición obtenga la dirección correspondiente. Los
pasos necesarios para la comunicación con RPC son:
1. Cuando cualquier servidor RPC (demonio o proceso que está a la espera
de una petición) es iniciado, este establece una dirección donde escuchará
la petición. Debe registrar el número de puerto (dirección), en el mapa
de puertos. El cliente y las aplicaciones del servidor tienen direcciones
arbitrarias.
2. Antes de que el cliente pueda hacer una llamada remota a procedimiento
4
Uamccia Locd
Figura 2.1: Petición local y remota.
(usando un número de servidor de programa), el mapa de puertos en la
máquina del servidor es consultado para identificar el número de puerto
que va a recibir el mensaje de petición de RPC.
3. El cliente y el servidor pueden entonces abrir una ruta de comunicación
para ejecutar el Procedimiento Remoto. El cliente produce una petición;
el servidor envía una, respuesta.
En la figura 2.2 puede verse como el cliente hace consulta al mapa de
puertos preguntando por Ita dirección del puerto donde el servidor escuchará las
peticiones. El servidor por su lado registraen el mapa depuertos la dirección del
puerto que utilizará para escuchar las peticiones. Una vez efectuado lo anterior
puede establecerse la ruta de comunicación.
2.4
CORBA (Common Object Request Broker
Architecture)
En 1989 fue fundada la OlMG (Object Management Group) y actualmente es
un consorcio de cerca de 700 miembros. Su principal meta es dar a
ls bases
para construir aplicaciones distribuidas orientadas a objetos, con lo cual desarrolló CORBA(Commor1 Object Request Broker Architecture). CORBA fue
diseñado para permitir que a
ls aplicaciones se comuniquen entre sí, sin importar la plataforma en la que estén, el lenguaje en el que hayan sido creados ni el
lugar donde se estén ejecutando. CORBA usa objetos para unificar la comuni-
5
I
I
r
,
Figura 2.2: Interacción cliente - servidor.
cación entre aplicaciones y también ofrece servicios para accesarlos por nombre,
guardarlos, mostrar sus estados y definir relaciones entre ellos, CORBA tiene el
potencial para tomar ventaja de cualquier otro desarrollo cliente/servidor. La
primera versión de CORBA salió en 1991, la versión 2.0 en 1994 y la versión 3.0
en 1998.
Los componentes que conforman CORBA son los siguientes:
ORB (Object Request Broker) Que es el que permite a objetos cliente que
invoquen a métodos de objetos servidor sin tener consideraciones del lugar
donde se encuentren estos últimos.
o
IDL (Interface Definition Languaje) Es usada para especificar el protocolo
por el cual los objetos distribuidos pueden ser accesados.
o
IIOP (Internet inter-ORB protocol) Un protocolo binario para la comunicación entre ORB, el cual permite mandar mensaje a sistemas remotos
de diferentes vendedores vía TCP/IP.
2.4.1
IDL (Interface Definition Language)
El lenguaje de definición de interfaz permite especificar el contrato y los límites
que tendránlos component,es,esto es que sólo hace la declaración de los métodos
y no los implementa. Cuando es compilada la interfaz en el cliente y el servidor,
a
ls entradas y salidas en los argumentos de los métodos son usadas para generar
el código marshal y unmarshal de los argumentos del método correctamente.
6
2.4.2ORB(ObjectRequestBroker)
Es la parte que permite tener objetos que hagan peticiones a otros objetos que
sean locales o remotos, esto permite obtener:
e
Invocaciones dinámicas y estáticas.
e
Unión a lenguajes de alto nivel.
e
Sistema auto descriptivo.
e
Transparencia remota/local
e
Seguridad en los mensajes.
o
Mensajes polimórficos.
La ORB del cliente es responsable de aceptar peticiones del cliente para
un objeto remoto, encontrando la implementación del objeto en el sistema distribuido, aceptando la referencia del lado del cliente con el objeto remoto. Del
lado del servidor laORBpermite que objetos del servidor registren nuevos
objetos, el servidor ORB recibe la petición del cliente ORB y usa la interfaz
del skeleton del objeto para invocar la activación del método de ese objeto, el
servidor ORB genera una referencia del objeto para elnuevo objeto y envía
esta referencia al cliente, el cliente ORB convierte esta referencia al lenguaje
específico y el cliente usa esta referencia para invocar métodos enel objeto
remoto.
2.4.3ORB
en elservidor
Una vez que las interfaz IDL ha sido escrita, esta puede ser convertida al stub
del cliente y el skeleton del servidor, para hacer esta tarea existen conversores o
compiladores que traducen la interfaz en código para ser usado por el lenguaje
en el que se realizará la implementación. Conversores de IDL existen para C,
C++, Smalltalk, Ada, Java (JOE es un compilador IDL para Java, y NEO es la
interfaz aplicación/programación que permite a los programas ser integrado a
NEO y es el que provee soporte para aplicaciones de redes integrando CORBA) ,
etc. El skeleton del servidor actúa como la base para la implementación de
la interfaz del objeto e incluye métodos específicos que el servidor ORB usa
para mapear una petición del cliente con la llamada del método del objeto
implementado. Una vez definido la implementación para el objeto, se necesita
registrar la implementaci6n del objeto con el servidor ORB y opcionalmente
ligarlo con un nombre. En lado del servidor tenemos los siguientes elementos:
e
Los stubs IDL del servidor.
0
La interfaz dinámica skeleton.
e
El adaptador de objetos.
7
o
La implementación d.el repositorio.
o
La interfaz ORB.
2.4.4
ORB en el cliente
El cliente usa un stub para accesar los datos y métodos de una instancia remota
del objeto. Un stub es generado compilando el IDL, el stub contiene métodos
específicos de CORBA para que el cliente ORB pueda realizar marshal a los
argumentos del método para ser enviados al servidor y unmarshal para valores
regresados. Los componentes que tenemos del lado del cliente son los siguientes:
o
El stub IDL del cliente.
o
La interfaz dinámica de invocación.
o
La interfaz depositora de APIs.
o
La interfaz ORB.
El stub y el skeleton no tienen porqué estar compilados enel mismo
lenguaje de programación.
Lenguajes soportados por CORBA: C, C++, Java, Ada95, Cobol y Smalltalk entre otros.
Plataformas Win32, IJnix , MVS
Protocolos de comunicación e interconexiones soportados por CORBA:
TCP/IP, IPX/SPX, FDDI., ATM, Ethernet.
Hardware: RISC y CISC.
Ventajas:
o
La creación de aplicaciones extensibles.
Soluciones escalables.
o
Desacoplo con la interfaz de usuario.
o
Independencia del lenguaje de programación.
o
Administración basa'da en el web.
Integración con productos comerciales NMS(network management system).
2.5
RMI(RemoteMethodInvocation)
El mecanismo RMI permite la acción de invocar métodos de unainterfaz remota
en un objeto remoto. RMI es parte de Java APIy ofrece loselementos necesarios
para desarrollar un sistema distribuido de objetos en Java citeRMITutoria1.
Los objetivos de RMI son:
8
Figura 2.3: Arquitectura de capas de RMI.
o
Dar soporte a llamadas de regreso del servidor a applets
o
Integrar el modelo de objetos distribuido en el lenguaje Java.
o
Desaparecer las diferencias entre modelos de objetos distribuidosy objetos
locales.
o
Hacer la escritura de aplicaciones distribuidas lo más sencilla posible.
o
Preservar la seguridad proveída por el ambiente de ejecución de Java.
El sistema RMI consiste de 3 niveles:
o
Nivel stub/skeleton
o
Nivel de referencia remota
o
Nivel de transporte
como se ve en la figura 2.3.
2.5.1
Nivel
stub/skeleton
El nivel stub/skeleton es la interfaz entre el nivel de aplicación y el resto del
sistema RMI. Esta capa no se preocupa con especificaciones de transporte, pero
transmite datos a la capa de referencia remota vía la abstracción de flujos marshal, el flujo marshal emplea un mecanismo llamado serialización de objetos el
cual permiteaobjetosJava
ser transmitidosentre direcciones remotas. Los
objetos transmitidos que usan el sistema de serialización de objetos son pasados
por copia a la dirección rernota, en caso de que los objetos transmitidos sean objetos remotos, estos son pasados por referencia. El stub para un objeto remoto
es el lado del cliente tiene como funciones:
9
o
Iniciar las llamadas a un objeto remoto.
o
Realizar el marshal a. los argumentos y mandarlos a un flujo marshal.
o
Informar al nivel de referencia remota que una llamada debe ser invocada.
o
Realizar unmarshal para el valor regresado de un flujo marshal.
o
Informar a el nivelde referencia remota que la llamadaha sido completada.
El skeleton para un objeto remoto es una entidad del lado del servidor que
contiene un método el cual atiende las llamadas para la implementación del
objeto remoto, sus funciones son descritas a continuación:
o
Realizar unmarshal de los argumentos obtenidos de un flujo de marshal.
Hacer la llamada para laimplementación del objeto remoto.
o
Realizar el marshal al valor regresado de la llamada o excepción en un
flujo marshal.
2.5.2
Nivel de referencia remota
El nivel de referencia remota se encarga de lidiar con la interfaz de transporte]
también es responsable por exteriorizar un protocolo de referencia remota específico. El nivel de referencia remota tiene 2 componentes que son cooperativos
entre si, uno del lado del cliente y otro del lado del servidor. El lado del cliente
tiene información específica para el servidor remoto y se comunica usando el
nivel de transporte vía la abstracción de un flujo orientado a conexión.
2.5.3
Nivel de transporte
El nivel de transporte es el encargado de poner la conexión con las direcciones
remotas, manejar las conexiones, escuchar las llamadas entrantes, mantener una
tabla de objetos remotos que existen en las direcciones] entre otras cosas.
Los componentes del sistema RMI son los siguientes:
2.5.4
Interfaz del objetoremoto
Es donde se hará la declaración del objeto y los métodos remotos que serán
usados por el cliente e implementados en el servidor, esta interfaz debe extender
la interfaz java.rmi.Fkmote con lo que se marcará al objetocomo objeto remoto
para el sistema RMI, el stub del cliente y el skeleton del servidor son creados
de esta interfaz.
10
2.5.5
Implementación en el servidor
Ya que sedefinió la interfaz del objetoremoto, se debe escribir la implementación de la interfaz enel servidor, este usualmente también extiende la
clase java. rmi. server .UnicastRemoteObject
y esta asu vez extiende la clase
java. m i . server.
Remoteserver
la cual es la clase base para implementar objetos en RMI.
2.5.6
El registro RMI
El registro se inicia usando el comando rmiregistry, este solo es necesario iniciarlo del lado del servidor, una vez que se inicia el registro en el servidor, por
default este usa el puerto 1099 aunque puede usarse cualquier otro. Una vez que
el registro esta funcionando uno puede registrar la implementación del objeto
usando un nombre, por medio de la interfaz java.rmi.Naming, por otro lado el
cliente puede localizar esta clase registrada usando java.rmi.Naming.lookup
2.5.7
Stub del cliente y skeleton del servidor
Una vez definida la interfaz del objeto y echa la implementación en la clase
servidor se compila la clase de forma usual en Java y para la creación del stub
y del skeleton se hace uso del compilador de stub de RMI llamado rmic [4]. El
skeleton actúa como una interfaz entre el registro RMI y las instancias de la
implementación del objeto en el servidor, cuando el cliente hace una petición
para la invocación de un método esta es recibida y el skeleton es llamado para
extraer los parámetros serializados y pasarlos a la implementación del objeto. un
stub del cliente es regresado al cliente cuando la instancia remota de la clase es
solicitada atravez de la interfaz Java.rmi.Naming, el stub tiene que engancharse
al subsistema de serialización del objeto en RMI para realizar el marshal a los
parámetros del objeto.
A continuación tenemos un ejemplo de un programa cliente/servidor implementado con RMI. Supongamos que tenemos una computadora que está
físicamente conectada a equipos de monitoreo de clima (termómetros, medidores de huwedad, etc). Este sería nuestro servidor. El método remoto que
se va a invocar es getClimaLectura( 1, se necesitará una implementación de
esto en e1 servidor, y tendremos que proveer de una interface al cliente para que
pueda saber cuales son los servicios ofrecidos.
Esta es la clase que encapsula las lecturas del clima.
import java.io.*;
public class Lectura implemeets
Serialirrable(
public String forecast;
public float lluvia;
public float temperatura;
11
public
public
float velviento;
String barometro;
public Lectura (String s,float r,float t,float w,String
b)
{
forecast = S ;
lluvia = r;
temperatura = t;
velViento = n;
barometro = b;
3
3
El código del cliente essumamente simple y se deben considerar dos aspectos importantes:
1. La definición de un administradordeseguridad;que
proporcionan las librerias de Java.
puedeserel
que
2. Definir un administrador de excepciones; el cual se encarga de notificar al
usuario de posibles problemas.
import java.rmi.*;
import java.rmi.server.RMIC1assLoader;
public class ClienteR
{
static public void main
(Stringu S ) {
System. setSecurityHanager(new RMISecurityManagero
1;
try {
Class cl= RMIClassLoader.loadClass("Ap1ic");
Runnable client= (Runnable) cl.neaInstance();
client.run();
3 catch(Exception e) {
System.out.println(e);
1
3
3
Esta es la parte del cliente
import java.
.rmi
Naming ;
12
public class Aplic implements Runnable
{
public voidrun0 C
Lectura g= null;
try C
ClimaIntf wi= (Clima1ntf)Naming.
lookup("//laryc.uam.nur/Clima");
g = wi .getClimaLecturaO;
3 catch(Exception e) C
System.out.println(e);
3
if (g! = null) C
System. out.
println("E1
clima.forecast)
es "+g
;
System.out.println(g.11uvia +
"cm. de lluvia
han caido recientemente");
System.out .println("la temperatura " es
+
g.temperatura + *'C+'>
;
System.out .println("velocidad del viento:I' +
g .velViento + "kmh") ;
System.out .println("el barometro indica
+
g.barometro);
I'
3
3
3
Esta es la interface donde se definena
ls funciones que soportará el servidor
import java.rmi.*;
C
public interface ClimaIntf extends Remote
public
Lectura
getClimaLectura0
throws
RemoteException;
3
Esta es el servidor e irnplementa los métodos que se definieron en la interfaz.
import java.rmi.*;
import java.rmi.server.UnicastRemote0bject;
13
public class ClimaImpl extends UnicastRemoteObject
implements ClimaIntfC
Lectura
g = new Lectura("soleado",O.OF,75.OF,5.OF,"steady");
public ClimaImplO throws RemoteException C
super ( 1 ;
3
public static void main (String argC1)C
System.setSecurityManager(new RMISecurityManagero);
try
ClimaImpl wi = new ClimaImplO;
Naming.rebind("Clima",wi);
System.out.println("Estaci6n de climafuncionando");
3 catch(Exception e) C
System. out.
println( "ClimaImpl error: + e) ;
3
3
public Lectura getClimaLectura() throws RemoteException C
return g;
3
3
Como puede verse es sumente simple tomar esta alternativa comparándola
con la opción de implementar la comunicación por medio de sockets. RMI
permite hacer referencia a métodos remotos, como si estos estuvieran en la
misma máquina.
2.6
Serialización de objetos
Otra facilidad que brinda RMI es la serialización de objetos, Java incluye esta
clase para poder convertir un objeto enun flujo de bytes y reensamblar los
bytes de nuevo a una copia idéntica del objeto original, en RMI la serialización
facilita el uso para realizar marshal y unmarshal a los argumentos objetos delos
métodos, cualquier objeto que sea usado como argumento en un método remoto
debe ser una extensión de java. io.Serializable [5].
Esta utilidad de serializar objetos será considerada para conseguir que el
programa guarde el trabajo realizado en un archivo, para m& tarde hacer uso
nuevamente de la información.
14
2.7
AWT
Otra de las caracteristica que será de gran ayuda para el desarrollo y diseño
de la interfaz el AWT(Abstract Window Toolkit), se debe tener en cuenta la
versión de Java que se emplea ya que hay diferencias en cuanto al modelo de
AWT que se emplea en la versión 1.0 y la versión 1.1 en adelante [6].
El cambio de java 1.1 más notable es el nuevo procesamineto de evento,
adoptado para el kit de herramientas de Interfaz de Usuario Gráfico (CUI) y de
ventanas AWT, se da esencialmente un modelo ”de llamada” citeGraficaAwt.
Cuando se crea un componente de GUI, se dice a éste qué método o métodos
debe invocar cuando ocurra un evento particular (por ejemplo, cuando el usuario
presiona un botón del mouse o elige un elemento en una lista). En este modelo
diferentes clases de Java representan las distintas clases de eventos, se da el uso
de listeners(oyentes), son objetos que se dedican a ofrecer los servicios cuando
determinado evento ocurre. Un objeto que genera eventos(un evento fuente)
mantiene una lista de oyentes interesados en saber cuándo ocurre el evento y
proporciona métodos que permiten a los oyentes agregarse y removerse de una
lista de objetos interesados.
El siguiente es un pequeño ejemplo del uso de los oyentes.
public class Escribir implements MouseListener
-t
private int ultimo-x, ultimo-y;
//le dice a este applet que objetos de MouseListener
public void i n t o
this.addMouseListener(this) ;
<
3
/ / Un método de lainterfaz MouseListener invocado cuando
// el usuario presiona el botón del ratón
public void mousePressed(MouseEvent e) <
ult imo-x
= e. getx ( ) ;
ultimo-y = e. gety()
;
3
Siempre que se emplean oyentes aun cuando algunos de sus métodos no
sean usados, como en el caso anterior, se deben definir sus métodos. Para evitar
esto se puede hacer usu de Adapatadores(Adapters) que nos permiten declarar
sólo los métodos que nos hacen falta.
15
Capítu10 3
Modelo de la Aplicación
Funcionalidad
ofrecida
3.1
La descripción del sistema comienza con la funcionalidad que este ofrecerá y
más adelante se comenzará con la descripción de los diagramas de clase.
o
Contar con un área que permita ver quienes están trabajando en ese momento con el documento que se eligió.
o
Contar con un área de envío y recepción de mensajes para lacomunicación
entre usuarios. Como característica, el usuario podrá elegircon cuales
personas desea comunicarse, o hacerlo con todas a la vez.
Disponer de un menú del cual se puedan escoger la aplicación con la cual
( así como el documento, ya que podrán existir varios
trabajos en torno a los cuales se forman grupos de trabajo).
se desea trabajar
o
Contar con un área de dibujo que permita escoger el tipo de elemento que
se desea dibujar. También debe poderse escoger el color para cada objeto.
o
De la misma forma que el punto anterior se debe contar con un área de
texto (en una ventana a parte del área de dibujo) que permita trabajar
con un documento de tipo texto.
o
Tener la posibilidad de guardar el trabajo ya hecho en un archivo con un
formato definido más adelante. Desde luego también deben poder abrirse
documentos ya creados y editarse.
3.2
3.2.1
Jerarquía deClases
Cliente
A continuación se muestra la jerarquía de clases del Cliente ver figura 3.1.
Las interfaces para
16
17
Figura 3.1: Jerarquía de ciases del cliente.
1nterface.WorkgroupInterface
Y
1nterface.FirstgroupInterface
sólo definen parte de lo que el sistema hace y serán las clases como
Workgroup
Y
Works.MainAp1icaction
las que realmente implementarán dicho comportamiento. A continuación se da
la descripción de lo que hacen a
ls funciones más importantes:
En general todas lasinterfaces extienden la clase java.rmi.Fkmote haciendo
que las clases que hagan uso de ellas, puedan ser llamadas remotamente. Siendo
la parte del protocolo que se utiliza en RMI.
La función
UpdateUserList
que pertenece a
1nterface.WorkgroupInterface
se encarga de actualizar la lista de usuarios cada vez que uno de estos
entra o deja el sistema recibiendo como parametro un elemento de tipo
java.uti1.Vector
que le permite saber quién fue el usuario que entró o salió.
o
La función displayMessage es parte de la inteface FirstgroupInteface y es
implementada en la clase MainApplication es parte del mecanismo que
implementa la comunicación entre usuarios.
o
La función Updatetopics que también es parte de FirstgroupInteface se
encarga de actualizar la lista de temas exitentes al momento de entrar un
usuario al sistema.
La clase DrawApplication se encarga de la creación y manipulación de los
objetos gráficos.
La clase TextApplication implementa aligual que las demás métodos, atributos y se vale de otras clases para poder manejar la utilidad de texto que es
parte del sistema.
Enseguida se incluye el código de la clase MainApplication.
18
package
import
import
import
import
import
import
import
//se utilizan 3 paquetes para
// modularizar el sistema
//en works se encuentran todas las
java.awt.*;
// clases relacionadas
//directamente con el cliente.
java.awt.event.*;
java.io.Serializable;
java.rmi.*;
java.rmi.server.*;
java.util.Vector;
Interface.*;
Works;
Esta parte se utiliza para incluir los paquetes necesarios empleados por
la clase. El mismo sistema se encuentra en un paquete y esto se hace con la
intención de modularizar que es una de las características mensionadas enel
capítulo de fundamentos al principio del trabajo.
//Se puede ver cuales son las clases que MainApplication
//extiende y las interfaces que implementa.
public
class
MainApplication extends Frame
implements WorkgroupInterface,
FirstgroupInterface,
Serializable,
Remote,
ActionListener,
WindowListener €
//se da ladescripción de las variables empleadas
Referencia al servidor
*/
private FirstInterface server;
private String addressserver;
private String userhlame;
private String grouphlame;
/** Indica si está conectado ha algún servidor
*/
private boolean state;
/** Contiene los nombres delos usuarios que estan en el mismo
tema */
private Vector partners;
/** Contiene los nombres de todos los usuarios del sistema
*/
private Vector allUsers;
/** Contiene los temas existentes en el servidor
*/
private Vector themes;
private ChatArea area;
/**
19
private Label statusBar;
private TextApplication textApplication;
private DrawApplication drawApplication;
public MainApplicationo{
state = false;
userName =
setMenuBar(new HenuMainApplication(this));
area = new ChatArea(this1;
add("Center",area) ;
statusBar = new Label("",Label.RIGHT);
add("South",statusBar);
pack() ;
1
//Esta función se encarga de obtener
y verificar el nombre de
// usuario
public voidactionPerformed(ActionEvent e) €
Vector v;
String S ;
Object o = e.getSource();
if ( o == area.msgField I I o == area. send)
{
S = area.msgField.getText0;
//verifica
que
nombre
el
if(s.length() > O) {
// del usuario
S = userName +
+ S + "\n"; //no tenga longitud cero
area.addMessage(s);
//y obtiene
a
los
// usuarios del grupo
area.
msgField
.setText("") ;
area.
msgField
.requestFocus( ) ;
v = area.getAlXPartners();
send(s,v) ;
'I:
'I
1
1
e.getAct
ionCommand()
;
if ( s == "salir") {
salir();
S =
1
if( s == "item 1") 4:
//paraunaaplicación de tipo
// texto
textApplication = new TextApplication(this,
"Text application: : + userName,this);
I'
textApplication.setLocation(l00,100);
textApplication.setVisible(true);
1
20
if(s == "item 2") €
//para
una
aplicación
de
// dibujo
drawApplication := new DrawApplication(this,
"Draw application: : + userName,this);
;
drawApplication. setLocation(100,lOO)
drawApplication.setVisible(true);
I'
3
3
/**
* Realiza la conexión con
* temas y de usuarios.
*/
el servidor obteniendo lista de
public boolean connecting(String address)
c
addressserver = " / , P + address + "/Firstserver";
try €
UnicastRemoteObject .exportObject(this)
;
server = (FirstInterface)Naming.lookup(addressServer);
if (server
== null) €
return false;
3
server.getListWorks(this);
3 catch(Exception e)
{
System.out.println(
"Error enMainApplication::connecting()");
e.printStackTrace();
return false
;
3
return
true;
3
/**
* Termina la conexi6n
*/
conel servidor.
public void disconnecting()<
try C
server.logoff(userNae,groupName);
state = false;
3 catch (Exception e)C
System.out.println(
"Error en MainApplication:
3
3
/**
21
:disconnecting()");
* Obtiene la direcc:i6n
* conexion.
*/
del servidor con el que se tiene
public StringgetAddress0
return addressserver;
<
{
public Vector getAllUsers()
return allUsers;
1
/**
* Obtiene
*/
el nombre del grupo donde se est& trabajando.
public StringgetGroup0 {
return groupName
;
1
public Vectorgetpartnerso
return partners;
<
3
public VectorgetThemes0 {
return themes
;
1
/**
* Obtiene
*/
el nombre de usuario que se est& usando.
public String getuser(){
return userName
;
3
/**
* Asigna
*/
un nombre de usuario
y un
nombrede grupo.
public void register(String group,String user)
{
WorkServerInterface workserver;
try <
workserver =(WorkServerInterface)
Naming.lookup(addressServer);
userName = user;
groupName = group;
if (workServer.login(this,user)) {
server.registerTopic(group,user);
state = true;
22
I
statusBar. setText("Name:" + user +
",
Theme: " + group) ;
3
3 catch (Exception e){
System.out.println(
"Error enMainApplication::register(String,String)");
3
3
public voidsalir0 c
if(state == true)
disconnectingo;
System.exit(0);
>
public void send(0bjecto ) C
send(o,partners) ;
3
/**
* Envía
*/
informaci6n
a
otros
usuarios.
public void send(0bjecto, Vector toUsers)
String partner;
if( toUsers. size(>==O)C
tousers = partners;
try C
server.
updateBuf
f
er, o )(groupName
;
3 catch(Exception e) C
System.out.println(
"Error en MainApplication:
:send(0bject ,Vector)")
;
System.out .println(" * server.updateBuffer0");
3
3
try C
for(int tmp = O; tmp < tousers.size0; tmp++) C
partner = (String)toUsers.elementAt(tmp);
if (userName. compareTo(partner)
!= O) C
server.unicastMessage(partner,o);
3
3
e) C
System.out.println(
"Error enMainApplication::send(Object,Vector)");
System.out.println(" * server.unicastMessage()");
3 catch(Exception
3
23
3
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
// Implementacih deWindowListener
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public void uindowActivated(WindowEvent e) {
3
public void windowClosed(WindowEvent e) {
Object o=e.getSource();
if(o == textApplication) {
textApplication = null;
3
if(o == drawApplication) {
drawApplicat ion 1- null ;
3
3
public void uindowClosing(WindowEvent e) {
Object o=e.getSource();
if (o == textApplication) {
textApplicat ion.
exit
() ;
3
if(o == drauApplication) {
drawApplication.exit();
3
3
public void windowDeactivated(WindowEvent e) {
3
public void uindowDeiconified(WindowEvent e) {
public void windowIconified(WindouEvent e) {
3
public void windowOpened(WindowEvent e) {
3
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
// Implementación de WorkgroupInterface
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
/**
*
Recibe
mensajes
provenientes
del
servidor.
*/
public void displayConnect(String message)
throws RemoteException{
area. addHessage( message
+ "\n") ;
area.msgField.requestFocus0;
3
/**
* Recibe
*/
public
la lista de usuarios de todos los grupos.
void
updateUserList(Vector users)
{
throws RemoteException
allusers = users;
String partner;
area.removeAllUseru();
for(int tmp = O; tmp < users.size(); tmp++) {
partner = (String) users. elementAt ; (tmp)
if (userName. compareTo(partner)
!= O)
area.addAllUsers(partner);
3
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
/ / Implementaci6n de FirstGroupInterface
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
/**
*
Recibe la lista
de
usuarios
del
mismo
grupo.
*/
public void clients(Vector users) throws RemoteException
{
partners = users;
String partner;
area.removeUsers0;
for(int tmp = O; tmp < users.size0; tmp++) {
partner = (String) users.elementAt(tmp);
if(userName.compareTo(partner) != O)
area.addUsers(partner);
3
3
<
public void content(0bjecto ) throws RemoteException
3
25
/**
* Recibe
*/
informaci6n de otros usuarios.
public void displayHessage(0bjecto ) throws RemoteException{
String S= o. getclass( ) .getlame() ;
System-out.println("Recibiendo:
+ S);
I'
if(s.compareTo("java.1ang.String")
area.addHessage((String)o);
== 0 ) {
3
else if(s.compareTo("Works.Text") ==
if(textApplication!=null) {
textApplication.recive((Text)o);
0) {
3
1
else if(drawApplication!=null) {
drawApplication.recive((Forma)o);
3
3
/**
* Recibe la lista de temas
*/
public
disponibles
en
el
servidor.
void
updateTopics(Vector themes)
throws RemoteException{
this.themes = themes;
3
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public static void main(String
arg[])
{
int aux;
Vector v;
boolean b;
AddressDialog a;
RegisterDialog r;
MainApplication m= new MainApplication();
a = new AddressDialog(m,"Server address:",ll);
;
a. setTitle("Server address")
a.setLocation(i00,100);
a.setVisible(true);
if(a.getEstado0 == false) {
m.salir0;
3
System.out.print("1ntentando conexi6n
a. getTexto(
)+'I
b = m.connecting(a.getTexto());
26
.. .
") ;
con el servidor
'I+
r = new RegisterDialog(m);
System.out.print("0bteniendo temas
. ..
"1;
v = m.getThemes0;
System.out .println("listo");
if(v != null) C
System.out.println("Cargando") ;
for(aux = 0;aux <: v.sizeO;aux++) C
r.addGroupList((String)v.elementAt(aux));
3
3
System.out .print("Obteniendo usuarios
. .. " ) ;
v = m.getAllUsers();
System.out.println("listo");
if (v!= null) C
System.out .println("Cargando")
;
for(aux = 0;aux < v.size();aux++) C
r.addUserList((String)v.elementAt(aux));
3
3
r.setTitle("User register")
;
r .setLocation( iO0,ioO) ;
r.setVisible(true);:
if(r.getEstado() == false) -(
m.salir0 ;
3
m.register(r.getGroup(),r.getUser());
m.addWindowListener(new ¡fina());
m.setTitle("REMM Application");
m.setLocation(i00,100);
m.setVisible(true) ;
1
3
class wina extends WindowAdapter
{
public voidwindowClosing(WindowEvent e){
System.
exit
(O) ;
3
3
27
El texto dentro del código da una descripción de cada una de las funciones.
Las clases se encuentran dentro de paquetes para obtener modularidad en
el sistema. Existen 3 paquetes uno de ellos esworks en donde se encuentran
a
ls clases relacionadas con el cliente, en el siguiente paquete se encuetran las
clases relacionadas conel servidor y enel último paquete se encuentran las
interfaces utilizadas. Se trata de agrupar en forma lógica las clases para obtener
la modularidad buscada.
3.2.2
Servidor
La jerarquía de clases del Servidor-ver figura 3.2-que se presenta es explicada a
continuación.
En el diagrama se puede ver como las interfaces extienden a la interface
Java.Rmi.Remote para poder implementar la comunicación.
Firstserver y WorkgroupServer se encargarande implementar las funciones
de las interfaces. Algunas de las funciones más reelevantes se presentan a continuación:
En el caso de broadcastConnect() se desea de implementar un multicast
(enciar mensage a todos los usuarios que pertenecen a un mismo grupo de
trabajo).
o
Con las funciones logoin() y logoffw() se pretende conectar y desconectar
del al sistema a un usuario registrandolo en una lista o eliminandolo de
ésta.
La función connect() recupera la ista de clientes en caso de encontrar
usuarios.
La clase Register será la estructura de la lista junto con los métodos que se
encargarán de manipular sus elementos(como AddRegisterO, Erase() y Seek())
A continuación se da el código de una de las clases más importantes del
servidor que es Workgroup9
, erver.
package Server;
//Este es el
paquete donde se encuantran las
// clases
import
import
import
import
import
import
Interface.*; //relacionas con el servidor
java.rmi.*;
java.rmi.server.*;
java.rmi.registry.LocateRegistry;
java.util.*;
java. * ;
28
~~
Figura 3.2: Jerarquía de clases del servidor.
29
En el código anterior puede verse el uso del paquete server para agrupar
los elementos que forman parte del servidor. Y enseguida comienza el código de
la clase WorkgroupServer.
//Esta clase se vale del unicast para implementar
// la comunicación
public class WorkgroupServer extends UnicastRemoteObject
implements WorkServerInterf { ace
//Se declara un Hashtable para enlistar
los usuarios
// y su referencia
protected static Hashtable broadcastList
= new Hashtable();
public WorkgroupServer() throws RemoteException
{
super( 1 ;
3
public voidconnect(Workgroup1nterface client)
throws RemoteException<
if (!broadcastList.isEmpty()) € //checa si hay usuarios
Vector v= getuserlist(); //obtiene la lista de clientes
// verifica que cliente se conecto para
// actualizar la lista
try €
//hace una llamada remota enviando
la lista
// de clientes
client.updateUserList(v);
1 catch (Exception e)€
System.out.println("Error en WorkgroupServer::connect");
System. out. println("WorkServer error:
+
e. getMessage()
);
e.printStackTrace();
3
3
I'
1
public void logoffW(String user) throws RemoteException
{
// remove el cliente desde broadcastList
// permitiendo que cada uno de los clientes conozca
// su salida
if (broadcastList.containsKey(user)) {
broadcastList.remove(user) ;
String message;
message = user + " leaves the Work
'I;
30
broadcastconnect
(message)
;
System.out.println(message);//despliega en consolala
// salida del cliente
3
Vector userList= getUserList0;
Enumeration e = broadcastList.elements();// enumara los
// clientes
// conectados.
while (e.hasMoreElements()) {
WorkgroupInterface c = (WorkgroupInterface)
e.
nextElement
(1 ;
updateUserlist(c, userlist); //actualiza la lista
3
public synchronizedboolean login(Uorkgroup1nterface client,
String user)
throws RemoteException{
if (broadcastList
.containsKey(user1)
//si el usuario esta contenido manda un mensaje
+ user +
client. displayconnect ("Login name
" ' is already in use."
+ "\nPlease type another user name.
;
return false;
'I'
'I)
3
// si el usuario no esta adentro
de lalista
// el user se usa como llave
y client como valor
// de la llave
broadcastList.put(user, client);
broadcastconnect (user
+ has entered the Workgroup")
;
System-out.printlnCuser + has entered")
;
Vector userList
= getUserList( ) ;
// enumera los clientes conectodos.
Enumeration e = broadcastList.elements( ) ;
while (e.hasMoreElements0){
WorkgroupInterface c = (WorkgroupInterface)e.nextElement();
//actualiza sus listas
updateUserList(c userlist) ;
I'
I'
~
3
return
true
;
3
public void broadcastConnect(String message)
{
/ / enumera las llaves
// y manda un mensaje
a todos los clientes de
= broadcastList .keys
(1 ;
Enumeration enum
31
lalista.
while (enum.hasMoreElements()) <
String key= (String) enum.nextElement();
WorkgroupInterf ace client
= (WorkgroupInterf ace)
broadcastList.get(key);
try { //hace uso de una llamada remota
client.displayConnect(message);
3 catch (Exceptione) {
System.out.printh(
"Error enWorkgroupServer::broadcastConnect");
System.out.println("Connect:
+ e.getMessage0);
e.printStackTrace0;
3
1
3
private Vector getuserlist(){
Vector v = new Vector();
// hace un vectorde usuarios.
Enumeration e= broadcastList.keys();
while (e.hasMoreElements()) {
String user= (String) e.nextElement();
v.addElement(user);
3
return v;
3
private
voidupdateUserList(Workgroup1nterface client,
Vector userlist){
// verifica que cliente se conecto para actualizar
// la lista
try {
client.updateUserList(userList);
1 catch (Exception e){
System.out.println(
"Error en Workgroupserver
: :updateUserList");
System.out.printXn("updateList error: + e.getMessage());
;
e.
printStackTrace()
'I
3
1
3
Los siguientes diagramas presentan una parte del modelo más detallada
mostrando cómo interaccionan a
ls clases relacionadas. En el primer caso se
tiene la figura quemuestra a DrawApplication 3.3. Anteriormente se había
explicado su funcionalidad.
32
\
i
Figura 3.3: Clases relacionadas con DrawApplication.
33
La figura que se muestra enseguida muestra a Textkpplication refI'extAp.
El diagrama de la clase AdressDialog permite ver cuales sona
ls clases con
a
ls que interactúa refDialog.
Por último se tiene el diagrama que muestra las relaciones entre la clase
encargada de serializar los objetos y las clase de forma y texto refserial. La clase
de forma se vale a su vez de otras clases que le permitirán dibujar rectángulos,
circulos y líneas.
En esta última parte del capítulo se presenta en forma m& ordenada las
clases que forman parte del sistema junto con sus métodos para dar una descripción que permitirá un mejor entendimiento. Tenemos la tabla reftablita
34
Figura 3.4: Clases relacionadas con TextApplication.
35
il./
Figura 3.5: Clases relacionadas con la clase AdressDialog.
36
/
/
!
\
I
\
j
Figura 3.6: Clases que sirven para crear los dibujos y el texto.
37
main ( )
getlistwork()
unicastMessage()
updateBuf er (f)
registerTopic0
logoff ( )
updateuser()
Register()
add ( 1
erase ( )
seek()
Workgroupserver
connect ( )
logoffw()
login()
broadcastConnect ( )
getUserList ( )
updateUserList ( )
AddressDialog
actionPerformed()
actualizarEstado()
cerrar ( )
getEstado()
getTexto()
setvisible0
Descripción
Es la parte servidor del sistema, encargada
de permitir la entrada a los usuarios al sistema
y de almacenar los temas de trabajo
programa servidor del sistema
envía al usuario la lista de temas registrados
envía un objeto a un usuario específico
actuliza el buffer del servidor
realiza el registro de un usuario y su tema
da de baja a un usuario
actualiza la lista de usuarios a cada usuario
con un tema en común
Es una lista ligada para contener a los usarios
de un tema en común, manteniendo un buffer para
el trabajo echo por los mismos
inserta un nodo a la lista
borra un nodo de la lista
busca un nodo dentro de la lista
Es usado por el servidor para enviar información
a todos los usuarios, también para dar de alta y
de baja a los usuarios del sistema
envía a cada usuario la lista de usaurios de
todo el sistema
borra a un usuario de la lista y avisa a los
demás usuarios
inserta un usuario a la lista y da aviso a los
demás usuarios
envía un mensaje a todos los usuarios del
sistema
regresa una lista de todos los usuarios del
sistema
envía la lista de usuarios de todo el sitema a
un usuario
Es una interfaz gráfica, donde se pide al usuario
una dirección válida de un servidor con el que se
quiera conectar
maneja las acciones al oprimir los botones
revisa si se ha introducido información antes de
continuar
es llamado antes de terminar la ventana de
dialogo
da el valor del botón oprimido por el usuario
da el texto intriducido por el usuario
muestra u oculta la ventana
Tabla 3.1: Clases y Métodos del sistema.
38
-
Descripción
Tiene un conjunto de métodos que deberán cumplir
las aplicaiones usadas por MainApplication
para revisar que se pueda cerrar una aplicacion
para recivir objetos de una aplicación externa
para enviar objetos a una aplicación externa
Es una forma usada por la aplicación de dibujo
que permite dibujar círculos
dibuja un círculo en un objeto panel.
Es una forma usada por la aplicación de dibujo
que permite dibujar círculos con relleno
dibuja la figura en un objeto panel
Interfaz gráfica creada para tener una área
donde se puedan recibir mensajes, otra donde se
pueden editar los mensajes a enviar y una
más que muestra los destinatarios posibles
sirve para insertar nombres en la lista de todos
los usuarios
sirve para insertar nombres en la lista delos
usarios compañeros
para mostrar texto en el áres de mensajes
borra todos los nombres de la lista de los
usuarios compañeros
quita todos los nombres de la lista de todos los
usuarios
obtiene una lista con los nombres escojidos en
ambas listas por el usuario
Es la aplicación de dibujo, contiene un área
para relalizar dibujos, provee por medio de un
menú las formas a dibujar y los colores
maneja las acciones del mouse y el menú
es llamado antes de terminar la aplicación
obtiene un objeto de figura, para que sea
dibujado por la aplicación
envía un objeto de figura, para que sea
transmitido
muestra u oculta la ventana.
sirve para escojer y abrir un archivo.
sirve para guardar en un archivo las figuras
dibujadas
-
Tabla 3.2: Clases y Métodos del sistema(Continuaci6n).
39
Clase o Método
saveAsFile()
readFile()
writefile()
DrawArea
crear ( )
dibujaro
dibujaro
getcolor ()
getDraw ( )
getTipo ( )
paint ( )
setcolor()
setTipo()
Forma
dibujar()
setcolor0
Linea
dibujaro
HainApplication
main()
actionPerformed()
connecting()
disconnecting()
exit ( )
Descripción
guarda en un archivo las figuras dibujadas,
pidiendo un nombre para el archivo a crear
lee de un archivo la información de las figuras
para dibujarlas
escribe en un archivo las figuras actualmente
dibujadas
Define un área donde se puede realizar dibujos
dado unas coordenadas y un tipo de figura se
crea un objeto de figura para que sea dibujado
dibuja en el área un figura
dibuja en el área una figura y además da la
opción de enviarla
obtiene el color actual que se está utilizando
obtiene en una lista las formas dibujadas en el
área
obtiene el tipo de la figura que se está
utilizando
redibuja las formas cuando es necesario
pone el nuevo color a utilizar
establece el nuevo tipo de figura a utilizar
Clase de donde serán dervadas las demás formas
para dibujo
para que sea dibujada la figura en un objeto
Panel
cambia el color de la figura
Es una forma usada por la aplicación de dibujo
que permite dibujar líneas
dibuja una línea en un objeto panel
Es la interfaz con el usuario, es la encargada
de contactar con un servidor dada una dirección
y de obtener los temas disponibles, así como de
enviar y recibir información de los otros
usuarios vía el servidor
programa cliente
maneja las acciones del menú
esta encargada de iniciar la conexion con el
servidor
termina la conexión con el servidor
método que es llamado cuando se quiere terminar
el programa
Tabla 3.3: Clases y Métodos del sistema(Continuaci6n).
40
’
Clase o Método
getAddress0
getAllUsers()
getGroup0
getpartners ()
getThemes ( )
getuser ()
register()
send ( )
send ( )
uindouActivated()
windowClosed()
windowClosing()
windowDeactivated()
windowDeiconif ied()
windouIconified()
windowOpened()
displayconnect ()
updateUserList ( )
clientso
updateTopics ( )
displayMessage()
content ( )
MenuDrauApplication
createMenuColors()
createMenuFile0
createMenuItem()
createMenuTools()
MenuMainApplication
createMenuApplication()
createMenuFile0
createMenuItem0
-
Descripción
da la dirección del servidor con el cual se
tiene la conexión actual
da una lista de los usuarios que estan usando el
sistema
da el nombre del grupo al cual se ingresó
da una lista de los usuarios que estpan en el
mismo tema
da una lista de temas o grupos disponibles en el
sistema
da el nombre del usuario que se está usando
realiza el registro de un usuario y de su tema
envía un objeto a todos los usarios del mismo
tema
envía un objeto a una lista de usuarios
específica
no usada
activada cuando se cierra alguna aplicación
activada antes de cerrar alguna aplicacion
no usada
no usada
no usada
no usada
implmentacion de WorkgroupInterface
implmentacion de WorkgroupInterface
implmentacion de FirstgroupInterface
implmentacion de FirstgroupInterface
implmentacion de FirstgroupInterface
implmentacion de FirstgroupInterface
Es le menú usado por DrawApplication
crea un menú para la elección de colores
crea un menú con las opciones de guardar, abrir,
cerrar
inicializa los items de menú
crea un menú para elejir un tipo de herramienta
de dibujo
Es el menú usado por MainApplication
crea un menú para la elección de aplicación
crea un menu para cerrar la aplicación
inicializa los items de menú
Tabla 3.4: Clases y Métodos del sistema(Continuación).
41
Clase o Método
MenuTextApplication
createMenuFile0
reateMenuItem0
MouseDrawArea
mouseClicked()
mouseReleased0
mouseDragged0
mouseMoved0
Ovalo
dibujaro
OvaloRelleno
dibujaro
Rectángulo
dibujaro
componer()
RectAnguloRelleno
dibujar0
RegisterDialog
actionPerformed()
actualizarEstado()
addGroupList0
addUserList ( )
cerrar (1
Descripción
Es el menú usado por TextApplication
crea un menú con las opciones de guardar,
abrir, cerrar
inicializa los items de menú
Aquí se encuentran 10s métodos usados para
dibujar formas en área de dibujo usandoel
mouse
cuando recíen se oprime el botón
cuando se suelta el botón oprimido del ratón
utilzado cuando se mueve el ratón y se tiene
oprimido un botón de este
sin usar
Es una forma usada por la aplicación de dibujo
que permite dibujar un ovalo
dibuja un ovalo en un objeto panel
Es una forma usada por la aplicación de dibujo
que permite dibujar un ovalo con el interior
dibujado
dibuja el ovalo dentro de un objeto panel
Es una forma usada por laaplicación de dibujo
que permite dibujar rectángulos
dibuja l a figura en un objeto panel
rectifica que las coordenadas sean las lógicasa
para dibujar la figura
Es una forma usada por la aplicación de dibujo
que permite dibujar rectángulos que son
dibujados en su interior
dibuja la figura en un objeto panel
Esta es una interfaz gráfica para que el
usuario introduzca un nombre con el que será
identificado dentro del sistema e introduzca un
tema que bien puede ser nuevo o ya existente en
el sistema
recojea
l
s acciones al oprimir los botones
revisa si los campos que necesitan información
están llenos
muestra los nombres de los temas disponibles
muestra en una lista los nombres de usuario ya
registrados
llamado antes de cerrar la ventana de dialogo
Tabla 3.5: Clases y Métodos del sistema(Continuaci6n).
42
fl
Clase o Método
getEstado (
getGroup0
getuser()
itemstatechangedo
setvisible0
Text
getText ()
TextApplication
actionPerformed()
openFile0
readFile()
saveFile0
setvisible0
textvaluechangedo
writeFile0
exit ( )
recive0
send ( )
yncDialog
act ionperformed( )
exit (1
getstate0
FirstgroupInterface
clients ( )
I
I
Descripción
obtiene si se introdujo información en todos
los campos para poder continuar o no
obtiene el texto de el área "group name"
obtiene el texto de el área "user name"
para la elección de un tema ya registrado
muestra u oculta la ventana
Es el tipo de información usada por la
aplicación de TextApplication
da el contenido en un String
Es la aplicación de texto, cuenta con un área
donde se puede editar texto y con un menú
para sus diferentes opciones
maneja las acciones del menú
abre un archivo de texto escojido por el
usuario y lo presenta en la aplicación
lee un archivo y muestra su contenido en el
área de texto
escribe en un archivo la información que
contiebe la aplicación
muestra u oculta la ventana
es activado cuando se hace algún cambio al
texto
escribe en un archivo lo que contenga el área
de texto
es llamado antes de cerrar la aplicación
obtiene un objeto texto para presentarlo en el
área de texto
envía un objeto de texto para que sea
transmitido
Es una interfaz gráfica para realizar una
pregunta al usaurio donde solo puede contestar
si, no o cancelar
recoje las acciones al oprimir los botones
este método es llamado cuando se pretende salir
de la ventana de dialogo
da la clave del botón que fue escojido por el
usuario
Interfaz para que el servidor envíe información
al cliente
se obtiene la lista de usuarios que están en el
mismo tema
Tabla 3.6: Clases y Métodos del sistema(Continuaci6n).
43
I
'
~~
Clase o Método
content ( )
displayMessage()
updateTopics ( )
FirstInterface
getListWorks()
unicastMessage()
gisterTopic0
logoff ( 1
updateBuf er ()
f
WorkgroupInterface
displayConnect0
updateuserlist()
~~
Descripción
se recibe del servidor el contenido del tema
se recibe el objeto enviado por otro usuario
se obtiene la lista de temas disponibles en el
servidor
Interfaz para que el cliente se comunique con
el servidor
pide la lista de temas registrados
envía un objeto a otro usuario por medio del
servidor
sirve para dar de alta a un usuario o crear un
tema
sirve para dar de baja a un usuario
sirve para actualizar el buffer de un tema
Interfaz para manejar la información por
grupos, del servidor al cliente
se reciben mensajes del servidor
se obtiene la lista de usuarios registrados en
todo el sistema
Interfaz para manejar la lista de usarios y
temas
da la listade usuarios de todo el sistema
borra a un usuario de la lista y avisa a los
demás usuarios
inserta un usuario a la lista y da aviso a los
d e m k usuarios
'
WorkServerInterface
connect ( )
logoff w ( )
login()
Tabla 3.7: Clases y Métodos del sistema(Continuaci6n).
44
Capítu10 4
Funcionamiento del Sistema
En este capitulo se describe cómo funciona el sistema haciendo la observación
de que es necesario tener la versión de Java 1.1.5. (con la cual fue desarrollado
el sistema) para evitar problemas.
Como ya se mencionó anteriormente el sistema se encuentra integrado por
paquetes. Para hacerlo funcionar primero se debe ejecutar el programa del
servidor (
Server.FirstServer
) el cual obtiene en forma automática ladirección IP de la máquina en la que
se
encuentra. Despues se debe ejecutar el cliente al cual deberá proporcionarsele
la dirección donde se encuentra el servidor [ambos pueden estar en la misma
máquina).
La ventana que el cliente presenta para dar la dirección se muestra en la
figura 4.1.
A continuación se presenta una ventana divida en tres secciones. En la
parte superior se pide al usuario que teclee el nombre quelo identificará durante
su sesión de trabajo y el nombre del tema o grupo con el cual desea trabajar (o
puede dar un nombre para crear un grupo nuevo); del lado izquierdo puede verse
Figura 4.1: Ventana de inicio del cliente.
45
Figura 4.2: Ventana de información del usuario.
una lista donde aparecen los temas existentes y del lado derecho los usuarios
que se encuentran trabajando.En la figura se muestra la ventana descrita 4.2.
Después de esto tenemos la ventana desde donde se puede enviar y recibir
mensajes. En la parte superior se encuentra el cuadro que permite capturar
el mensaje que se desea enviar y aun lado de &te esta
el botón para enviar
el mensaje escrito. Siempre que se envie un mensage este llegará a todos los
usuarios que componen ese grupo, a menos que se seleccione a l a persona o
personas que se desea reciban en el mensaje enviado. Esto último puede hacerse
en la lista del lado inferior derecho. En ese mismo ladose encuentra información
del usuario. En el menú de esta ventana se encuentran tres opciones:
o
La primera que es Archivo permite guardar el trabajo en un archivo, abrir
un archivo existente y salir del sistema.
o
La segunda opción permite crear el ambiente para trabajaren una ventana
de texto.
0
La tecera permite crear el ambiente para trabajar en una ventana
dibujo.
Esta ventana se presenta en la figura 4.3.
Las últimas dos ventanas son el área de texto y el área de dibujo.
46
de
Figura 4.3: Ventana para el intercambio de mensajes.
En cualquiera de las dos cuando se realiza un cambio los demás usuarios
en el mismo grupo o tema verán los cambios en tiempo real.
En la ventana de dibujose tiene el menú de archivo para guardar, abrir un
archivo o salir de la aplicación 4.4.
En la ventana de dibujo se encuentran dos opciones de menú. La primera
es la opción de archivo con las mismas subopciones de guardar, abrir archivo y
salir. La siguiente opción permite elegir las formas disponibles a dibujar (que
son: línea, rectángulo, círculo, elipse, rectángulo relleno, círculo relleno, elipse
rellena), así comoloscolores. Siempre que seelige una forma y un color la
aplicacióna
ls seguirá utilizando hasta que el usuario las cambie. la ventana de
dibujo se muestra en la figura 4.5.
47
48
Figura 4.5: Ventana de dibujo
49
Capítulo 5
Conclusiones
Una de las intenciones de esta exposición es mostrar la sencillezcon la cual
el mecanismo de Java RMI permite implementar la comunicación entre dos O
más computadoras conectadasen una red. También, las ventajas que la programación orientada a objetos ofrece para la definición de un modelo que permita
evolucionar la aplicación de forma natural y sin necesidad de partir desde cero
Se trata de conseguir en el modelo del sistema un grado deabstracción que
lo torne flexible para que cuando sedeseenhacer adecuaciones, sólo necesite
extenderse su funcionalidad y no cambiar sus elementos.
Pensando en posibles extensiones del sistema se debe hacer la aclaración de
las limitaciones que RMI tiene en cuanto al tipo de información que maneja, tal
vez si se desea crear una aplicación que maneje archivos de imagen o archivos
de sonido (como una aplicación que pretenda comunicar a dos personas para
conversar) el sistema utilizando RMI se vuelva lento. Podría ser más adecuado
pensar tal vez en Corba aunque esta solución resulta en exceso costosa debido
al elevado precio de CORBA.
Con respecto a crear un ejecutable que evite la necesidad de la máquina
virtual de Java puede pensarse en utilizar Java Café para hacer esto. Sin embargo se perdería un punto importante por el cual se escogió Java, que es la
independencia de plataformaen la cual se ejecuta el programa, aunque por otro
lado se incrementa la velocidad del sistema.
Otra de las enormes ventajas de utilizar Java a parte de la facilidad para
comunicarse con RMI y la sencillez para crear una interface con AWT se encuentra la portabilidad delcódigoya que para poder ejecutar el sistema en
otra plataforma distintasólo debe disponerse de la máquina virtual de javasin
necesidad de hacer ninglin cambio.
Se pensó en un principio en dejar que un usuario pudiese comunicarse con
cualquier otro usuario, pero con esto se dejaría de lado el concepto de grupos
que maneja el sitema, además de que sería necesario llevar varios buffers para
saber qué se tiene con cada usuario, con lo cual se complicaría demasiado el
sistema, por eso se optó por dejar que sólo se pudieran intercambiar mensajes
con usuarios de otros temas.
50
Como planes a futuro para el programa, están el de mejorar la interfaz
gráfica sobre todo para la aplicación de dibujo, concretamenteralizar una mejor
forma de escojer colores y de elejir la herramienta para realizar el dibujo,la
adición de nuevas formas de dibujo debe ser relativamente secilla ya que el programa sehizo pensando en eso. En cuanto al programa MainApplication, se
hizolo posible para que nosele hicieran m& modificaciones, sino que sólo
se aumentaran las aplicaciones con proposito específico,comoenelcaso
de
TextApplication y de DrawApplication pensamos que una manera sencilla de
extender las aplicaciones del programa MainApplication es hacer que las aplcaciones puedan cargarse en tiempo de ejecución a manera de "plug-in", es por
este motivo que se utilizó la interfaz Application para que todas las apliciones
tengan los métodos necesarios para enviar y recibir información con la aplicación
principal.
Finalmente el código del programa y la aplicación en sí misma se pueden
obtener en la siguiente dirección 1aryc.uam.mx
51
Bibliografía
[I] Grady booch. AnaEisis y Dise o Orientado a Objetos. Prentice-Hall, 1995.
[2] Jery Edwards Robert Orfali, Dan Harkey. The Essential Distibuted Objects
Survival Guide. Addison-Wesley, 1996.
[3] John Bloomer. Power Programing with RPC. OReilly-And-Associates, sec-
ond edition, 1996.
[4]Sun Microsystems. Java Remote Method Invocation Specification. Sun, 1997.
[5] Peter Van der Linden. Just Java. Prentice-Hall, 1997.
[6] Gosling Jamesand Ken Arnold.
Addison-Wesley, 1997.
52
El Lenguaje de ProgmmacionJava.