El
chat que se muestra en esta publicación utiliza sockets para la
comunicación, se desarrolló utilizando Java 1.8 y NetBeans 8.0. El
ejemplo está formado por dos aplicaciones, el cliente y el servidor,
ambas pueden descargarse de los siguientes enlaces:
Todo
el código dentro ambos proyectos está documentado con comentarios
que explican su funcionamiento.
Funcionamiento
del chat
Para
que el chat funcione correctamente, debe ejecutarse primero la
aplicación servidor, en la que el cliente debe ingresar el puerto
por el cual el servidor escuchara las conexiones de los clientes que
participen en el chat. Puede dejarse el puerto por defecto o puede
indicarse uno diferente, que no esté siendo utilizado por ninguna
otra aplicación.
Si
el servidor inicia correctamente se mostrará una ventana como la
siguiente.
En
este punto ya podremos ejecutar aplicaciones cliente que se conecten
al chat, al ejecutar la aplicación cliente nos pedirá la IP de la
máquina en la que se ejecuta la aplicación servidor, por defecto
tiene la dirección de localhost,
en este caso se utiliza esta porque el servidor y todos los clientes
se están ejecutando en la misma máquina. Además de la dirección
IP, se debe ingresar el puerto por el que el servidor escucha las
conexiones de los clientes y el nombre del usuario que se desea
conectar.
Si
la conexión es correcta, entonces se muestra una ventana que tiene
una JTextArea
en la que se muestra el historial de las conversaciones, un JComboBox
que muestra el listado de los usuarios conectados a los que se puede
enviar mensajes, un JTextField
en el que se puede ingresar los mensajes a enviar y un JButton
para enviar el mensaje.
Si
solamente está conectado un cliente, no habrá nadie a quien se le
pueda enviar mensajes, si el cliente intentara enviar uno se
mostraría el siguiente mensaje de información.
Al
ejecutar más de un cliente estos ya podrán comunicarse entre sí.
Luego
de que los clientes envíen y reciban múltiples mensajes se tiene
algo como lo siguiente.
Si
se cierran las ventanas, la aplicación cliente considerará que el
usuario está cerrando sesión y enviará una notificación al
servidor para elimine a este cliente de la lista de clientes y
notifique al resto de los usuarios conectados que deben eliminarlo de
su lista de contactos.
En
la aplicación servidor se muestra un log, en el que se informa
cuando un usuario inicia o cierra sesión.
Si
el servidor se cierra repentinamente, mientras aún hay clientes
conectados, estas aplicaciones cliente se cerrarán luego de mostrar
el siguiente mensaje.
Si
se intenta ejecutar una aplicación cliente sin haber ejecutado antes
la aplicación servidor o se ingresa una dirección IP o un puerto
equivocado se mostrará el siguiente mensaje.
Lógica
del chat
El
chat consiste de dos aplicaciones, el cliente y el servidor, el
servidor se ejecuta una vez y el cliente se ejecuta N
veces, donde N
es el número de usuarios que participarán en el chat, todos los
mensajes que los usuarios del chat se envían entre sí pasan a
través del servidor, cuando un cliente quiere enviar un mensaje a
otro, le envía el mensaje al servidor indicándole su destinatario y
el servidor se encarga de reenviar este mensaje, el servidor también
se encarga de indicarle a todos los usuarios cuando un usuario nuevo
se conecta al chat, para que puedan incluirlo en su lista de
contactos y por ende en la conversación. Asimismo, cuando un cliente
se desconecta, el servidor se encarga de informar a todos los
usuarios que deben eliminar al cliente que cerró su sesión de la
lista de contactos porque ya no podrán enviarle mensajes. No hay
comunicación directa entre clientes, el servidor siempre es
intermediario entre la comunicación de los clientes. Si se ejecutara
el servidor y luego se ejecutaran cuatro clientes que se conectaran a
dicho servidor, la comunicación sería como se muestra en la
siguiente imagen.
Funcionamiento
del servidor
El
servidor tiene tres clases, que se describen a continuación:
- VentanaS: esta clase gestiona la interfaz gráfica del servidor, que básicamente muestra un log de las principales acciones del servidor (conexión y desconexión de clientes).
- Servidor: Esta clase gestiona a los clientes que se conectan al servidor, es un hilo que tiene como principal función escuchar constantemente en caso de que algún nuevo cliente quiera conectarse al chat.
- HiloCliente: Cada vez que un nuevo cliente se conecta, dentro de la clase servidor se instancia un nuevo HiloCliente y se agrega a la lista de clientes. Este hilo cuenta con un socket con el que puede enviar y recibir mensajes del cliente con el que está conectado y tiene como principal función escuchar constantemente en caso de que el cliente envíe mensajes.
A
continuación se muestra una imagen que ilustra el funcionamiento de
la aplicación servidor.
Funcionamiento
del cliente
El
cliente tiene dos clases, que se describen a continuación:
- VentanaC: esta clase gestiona la interfaz gráfica del servidor, que básicamente muestra una lista de contactos, un historial de conversación, una caja de texto para ingresar nuevos mensajes y un botón que permite enviar mensajes.
- Cliente: Cuando el cliente se instancia y se conecta con el servidor, se crea un hilo que está escuchar constantemente en caso de que el servidor envíe mensajes. Este cliente cuenta con un socket con el que puede enviar y recibir mensajes del servidor con el que está conectado.
A
continuación se muestra una imagen que ilustra el funcionamiento de
la aplicación cliente.