Chat con Sockets en Java

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:

Chat con Sockets en Java (Servidor).

Chat con Sockets en Java (Cliente).

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.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×