A.10. Red

10.1. Vamos a ver como ejemplo una aplicación de chat para el móvil. En el directorio ejemplos de las plantillas de la sesión se encuentra una aplicación web con todos los servlets que necesitaremos para probar los ejemplos. Podremos desplegar esta aplicación en Tomcat para hacer pruebas con nuestro propio servidor.

Podemos encontrar la aplicación de chat implementada en el directorio Chat, que realiza las siguientes tareas:

?accion=login&id=<nick_del_usuario>

Si el login es correcto, el servidor nos devolverá un código de respuesta 200 OK. Además deberemos leer la cabecera URL-Reescrita, donde nos habrá enviado la URL rescrita que deberemos utilizar de ahora en adelante para mantener la sesión.

?accion=lista

Esto nos devolverá como respuesta una serie de mensajes, codificados mediante un objeto DataOutputStream de la siguiente forma:

<nick1> <mensaje1>
<nick2> <mensaje2>

...
<nickN> <mensajeN>

De esta forma podremos utilizar un objeto DataInputStream para ir leyendo con el método readUTF las cadenas del nick y del texto de cada mensaje del chat:

String nick = dis.readUTF();
String texto = dis.readUTF();

?accion=enviar

El mensaje se deberá codificar en binario, escribiendo la cadena del mensaje con el método writeUTF de un objeto DataOutputStream. Si obtenemos una respuesta 200 OK el mensaje habrá sido enviado correctamente.

10.2. Vamos a acceder desde el móvil a nuestra tienda virtual. Mostraremos en el móvil una pantalla en la que aparecerá la lista de productos que hay disponibles en nuestra tienda. Al pulsar sobre cada uno de ellos nos mostrará información detallada sobre el producto.

Tenemos la aplicación base implementada en el directorio Tienda. Deberemos añadir en el método leeProductos de la clase ListaProductos el código necesario para leer la lista de productos de la red.

Para ello conectaremos a la URL donde tenemos el servlet de nuestra tienda y leeremos la información de los productos que nos envía en la respuesta. La información que se envía consiste en una serie de objetos Producto serializados. Para leerlos podremos deserializar objetos Producto del flujo de entrada hasta que se produzca una EOFException, indicándonos que se ha llegado al final del flujo.

10.3. 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.

10.4. 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.