Skip to main content

Chat multi-hilos cliente/servidor escrito en Java siguiendo el patrón de diseño MVC - Parte II


Hola amigos,

Si siguieron correctamente las instrucciones del post anterior (Chat multi-hilos cliente/servidor escrito en Java siguiendo el patrón de diseño MVC - Parte I) entonces ya habrán tenido la oportunidad de haber ejecutado mi chat, al que cariñosamente he bautizado "bigchat".  En algunas ocasiones me referiré a la aplicación como "bigchat" así que es importante que se familiaricen con el nombre.

Antes de entrar en materia explicando las diferentes clases que componen el corazón de "bigchat" es necesario abordar una introducción de algunas conceptos que he tenido en cuenta al momento de desarrollar este proyecto.  Así que comencemos:

  • PATRÓN DE DISEÑO (Modelo-Vista-Controlador)
El patrón de diseño Modelo-Vista-Controlador muy conocido también por sus siglas MVC, no es más que un esquema de programación que tiene como finalidad hacer más legible el entendimiento de una aplicación al separar  su diseño en tres componentes fundamentales: el modelo, la vista y el controlador.

Entendemos por modelo el código de una aplicación que implementa su lógica sin necesidad de una interfaz gráfica de usuario (GUI).  Es como decir, la aplicación misma pero desarrollada e implementada en modo consola.  La vista sería la representación gráfica a manera de interfaz de usuario del conjunto de atributos y los resultados del procesamiento de esos mismos atributos, algo así como la pantalla de cara al usuario de la aplicación.  Finalmente, el controlador hace las veces de orquestador entre el modelo y la vista, gestionando los eventos que dan pie para enlazar la vista con el modelo y vice-versa.

En bigchat existen 3 módulos (subpaquetes) que constituyen la aplicación en su totalidad.  Estos módulos son: bigclient, biglauncher y bigserver.  El módulo bigclient (com.bigchat.es.bigclient.*) implementa el cliente de chat que será utilizado por un usario queriendo conversar en la sala de chat.  El módulo bigserver (com.bigchat.es.bigserver.*) implementa el servidor de chat que recibirá los mensajes de los diferentes usuarios que se conecten por medio del cliente de chat.  Finalmente el módulo biglauncher (com.bigchat.es.biglauncher.*) implementa una mini-aplicación que permite ejecutar una instancia del servidor y una o varias instancias del cliente.

Cada uno de los módulos anteriores lo he diseñado e implementado siguiendo en mayor medida el patrón de diseño MVC.  Por tanto, en cada uno de ellos encontraran una clase que implementa la lógica, la vista y el controlador.  Ya juzgarán ustedes si mi diseño e implementación de MVC les complace o no.

Módulos de bigchat siguiendo el patrón MVC


Para profundizar un poco más sobre este diseño, valdría la pena echar un vistazo al siguiente artículo: Entendiendo el Patron MVC (Modelo, Vista, Controlador).
  • CONCURRENCIA EN JAVA (Clase Thread e Interfaz Runnable)
Para implementar un esquema de concurrencia en Java en donde podamos tener "hilos" o "procesos ligeros" que realicen ciertas tareas, tenemos entonces que hacer uso de instancias de objetos que hereden de la clase Thread o bien implementen la interfaz Runnable.  Tanto la clase Thread como la interfaz Runnable disponen de un método run()  que será invocado una vez que el hilo o subproceso sea iniciado con el método start().

En bigchat, el servidor de chat implementa hilos heredados de la clase Thread para gestionar la comunicación con cada uno de los usuarios que desea conversar en la sala de chat por medio de su cliente de chat.  Por tanto, existirá un hilo De igual modo, el cliente de chat implementa un hilo de control para gestionar la comunicación con el servidor de chat.  Las interfaces gráficas de usuario (GUI) o bien las "vistas" utilizan componentes de SWING que de por sí ya implementan la interfaz Runnable.
  • COMUNICACIÓN EN RED (Clases ServerSocket y Socket)
Para lograr que el servidor de chat pueda aceptar conexiones de red entrantes por parte del cliente de chat que utiliza cada usuario, el servidor implementa objetos de la clase ServerSocket para poder escuchar por el puerto que se seleccione para tal fin.  Una vez el servidor acepta una conexión entrante por medio del método .accept(), la conexión se transfiere a un objeto de la clase Socket para gestionar la comunicación con el cliente.

Del lado del cliente de chat, éste implementa objetos de la clase Socket para comunicarse con el servidor de chat en el puerto que se haya elegido para la comunicación.
  • INTERFAZ SERIALIZABLE
Finalmente debo comentarles que algunas clases que he desarrollado en este proyecto implementan la interfaz Serializable.  En términos simples un objeto que implementa esta clase quiere decir que puede ser transformado automáticamente en una sucesión de bytes que pueden ser leídos desde una fuente o transferidos hacia un destino conservando la estructura del objeto en sí y sin perder su integridad.  Esto facilita mucho las operaciones de lectura y escritura de mensajes que realizan tanto el servidor como el cliente.

Hay que mencionar también que si el objeto que implementa Serializable cuenta con atributos (variables miembro) que sean de instancias de otros tipos propios, se debe garantizar que los objetos de estas clases también implementen la interfaz Serializable.

A continuación les muestro el diseño de una de las clases que utilizo en bigchat que justamente ilustra los conceptos explicados sobre la interfaz Serializable:

Clase chatEnvelope Serializable

Comments

Popular posts from this blog

Chat multi-hilos cliente/servidor escrito en Java siguiendo el patrón de diseño MVC - Parte I

Hola amigos, Espero que todos se encuentren muy bien y que todos sus planes estén marchando de la mejor manera en este 2018. En esta ocasión aprovecharé para compartir con ustedes una aplicación que he desarrollado en mi tiempo libre y que se encuentra escrita en lenguaje de programación Java.  La aplicación implementa multi-hilos de las clases ( Thread y Runnable ) y sockets ( Socket y Serversocket ) para una correcta comunicación entre los clientes y el servidor de chat.  Cuenta con una interfaz gráfica de usuario ( GUI ) utilizando componentes swing tanto para el cliente como para el servidor.  Además, cabe mencionar que hice todo lo posible para lograr una implementación del patrón de diseño MVC (modelo-vista-controlador). Antes de entrar en detalle sobre las diferentes clases y utilierías que he utilizado para desarrollar este proyecto, es necesario hablar sobre los pre-requisitos del mismo.  Así como también abordar una breve explicación del pat...