Ejercicios de conexiones avanzadas

18.1. En el directorio PruebaBT podemos encontrar una aplicación sencilla de ejemplo que establece una conexión bluetooth. Podemos cargar varios emuladores que se conecten como esclavos y un emulador que haga el papel de maestro. Realizaremos lo siguiente:

Una vez probada la aplicación, se pide:

a) Convertir la aplicación en un chat. Para ello se creará un nuevo formulario para la pantalla de chat, que tendrá como items un cuadro de texto donde podremos introducir nuevos mensajes, y a continuación una lista de los mensajes enviados por los usuarios.

Este formulario de chat utilizará los flujos de entrada y salida abiertos por la conexión bluetooth para recibir y enviar mensajes respectivamente.

AYUDA: El formulario puede tener un TextField para enviar mensajes y a continuación una serie de StringItem con los mensajes que se intercambian en la conversación. Cada vez que se recibe un mensaje, se puede insertar en la segunda posición del formulario, justo después del cuadro de texto, para tener siempre arriba los últimos mensajes recibidos.

Cada vez que se escribe un mensaje, se puede enviar a través del flujo de salida como una cadena UTF. Para recibir mensajes, podemos tener un hilo ejecutándose indefinidamente esperando leer cadenas UTF del flujo de entrada. Cada vez que llegue una nueva cadena se mostrará como mensaje en el formulario.

b) Hacer que el chat realice una conexión punto-a-multipunto, para permitir tener conectados múltiples usuarios. Para ello el maestro deberá conectarse a todos los esclavos que haya localizado durante la busqueda, manteniendo abierto un par de flujos entrada/salida para cada uno de ellos.

El maestro será el responsable de reenviar los mensajes que le lleguen de cada esclavo a todos los esclavos conectados. Para ello se propone el siguiente mecanismo:

RECOMENDACIONES: Como recomandación para el diseño de las clases, se recomienda crear una interfaz ConexionChat, que incorpore dos métodos envia y recibe que sirvan para enviar y recibir respectivamente mensajes a través de la red. Se harán dos implementaciones de esta interfaz: ConexionCliente y ConexionServidor, que gestionen la conexión de los esclavos y del maestro respectivamente.

En el caso del cliente (esclavos), los métodos envia y recibe siemplemente enviarán y recibirán cadenas UTF a través de los flujos de entrada/salida.

El caso del servidor (maestro) será más complejo. La clase ConexionServidor deberá gestionar una lista de clientes conectados. De cada uno de ellos se almacenarán los flujos de entrada/salida para comunicarse con él. Deberá haber un hilo por cada cliente conectado, esperando recibir datos de ese cliente. Cada vez que se reciba algo de un cliente, se añadirá a una lista de mensajes recibidos y se difundirá a los demás clientes.

El método recibe comprobará si hay mensajes en la lista de mensajes recibidos, y de ser así sacará el primero de la lista y lo devolverá. Si no, se quedará esperando hasta que se reciba un mensaje.

El método envia añadirá el mensaje a la lista de mensajes recibidos (para que lo reciba también el mismo servidor), y difundirá el mensaje a todos los clientes conectados.

18.2. En el directorio PruebaSW se encuentra una aplicación que utiliza un servicio web sencillo. El servicio web que se utiliza se puede encontrar en el directorio HolaMundoSW, implementado con JWSDP. Desplegar el servicio en JWSDP y probar la aplicación PruebaSW en un emulador. Comprobar que se conecta correctamente al servicio.