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 cabeceraURL-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étodoreadUTF
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 objetoDataOutputStream
. Si obtenemos una respuesta200 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.