Chat en Java usando Sockets en NetBeans 6.0

viernes, 7 de diciembre de 2007
Actualización:
Ver la siguiente entrada, un chat mejor que el aquí expuesto (desarrollado por mi también).

Hola, esta vez les traigo un chat que desarrollé en java. En la red hay varios, pero todos son demasiado simples y no muestran mucha funcionalidad, y la mayoria funcionan por consola. Todos los ejemplos que he encontrado solo envian Strings (cadenas de texto) por la red, pero que pasa si se quiere enviar objetos ? imagenes, colores, etc ?

El chat que desarrollé utiliza sockets, los cuales funcionan bajo una arquitectura cliente servidor, en donde se tiene un servidor y los clientes se conectan a éste y a través de él, se comunican entre si. La gracia del chat es que hace envio de objetos en vez de simples cadenas de texto, para ésto se utiliza la clase ObjectInputStream y ObjectOutputStream, los objetos de estas clases permiten escribir y leer objetos con los metodos writeObject y readObject, ambos reciben como parámetro un objeto. Cuál es el truco ? que todo lo que viaje por la red debe estar serializado, en el caso del chat se utiliza una clase Mensaje, la cual tiene un contenido (avatar, color de la fuente, mensaje en texto, etc) y cada parte del contenido debe estar serializado a su vez, si alguna cosa no está serializada, entonces la clase que lo contiene no podrá estarlo tampoco.

Para tener una visión completa del sistema, los invito a ver la arquitectura del chat:


Como pueden ver, el cliente consta de dos partes fundamentales, Cliente y Orquestador.

Cliente es la parte gráfica, la que el usuario vé y Orquestador es la parte que se conecta con el servidor y maneja la lógica (envía y recibe mensajes).

La parte servidor tiene un Servidor que recibe las conexiones y maneja una lista de clientes, la cual está en un objeto de la clase RecursoClientes, la cual utiliza el patrón de diseño Singleton (thread safe). Cuando un cliente se conecta, el Servidor recibe el nickname del Cliente y busca en la lista si ya existe, de ser así impide la conexión y avisa al Cliente (es una regla que implementé), en caso contrario la conexión se acepta y se delega el trabajo a un thread ManejadorCliente, el cual se encarga de recibir los mensajes del Cliente y se los pasa a los demás Clientes de la lista, además se encarga de quitarlo de la lista cuando éste se desconecta y avisa a los demás de la desconexión (entre otras cosas).

El problema con la arquitectura utilizada es que mientras mas clientes se conecten, mas recursos del servidor se utilizarán, ya que por cada cliente se crea un nuevo hilo (Thread). Una solución es NO usar Threads ni Sockets, sino usar SocketChannel de java.nio, pero es más difícil de utilizar (y entender), pero vale la pena ya que la baja en la utilización de recursos es altísima, además de una mejora sustancial en la eficiencia y rapidez de respuesta en el servidor. El cliente quedaría igual. En otra ocasión mostraré un caso utilizando SocketChannel.

Si les interesa pueden ver el diagrama de clases del cliente


y del servidor.


El servidor es bastante mas sencillo en el sentido de que son menos clases, pero hay que entender algunos conceptos que son mas difíciles de tragar, que son el patrón de diseño Singleton (thread safe) y la concurrencia con Threads. Por lo demás es bastante simple.

El cliente es mas complejo en el sentido que tiene mas clases, pero varias son solo clases para definir algunas cosas gráficas, nada complejo de entender. La clase mas importante es Orquestador, que es la que se encarga de toda la lógica y paso de mensajes hacia el cliente (a través de la interfaz OrquestadorInterface) y hacia el servidor (otros clientes).

Hay que tener en cuenta que lo que se envía por la red son objetos de tipo Mensaje, por lo tanto esa clase debe estar tanto en el cliente como en el servidor.

Acá pueden ver el diagrama de secuencia del servidor


y del cliente.

Con esos diagramas es fácil entender el paso de mensajes entre los objetos que conforman el software, tanto en la parte cliente como en el servidor. Por ejemplo se puede ver la secuencia de mensajes desde que un cliente se conecta hasta que se desconecta.

Una gracia de usar NetBeans 6.0 es que viene con UML integrado y soporta ingenieria inversa (o reversa) por lo que pueden hacer diagramas de cualquier tipo (soportado) desde el código fuente con un simple click derecho en el proyecto -> Reverse Engineer y listo. También pueden generar un nuevo proyecto UML y generar código a partir del diagrama de clases, es decir pueden utilizar UML hacia ambos lados, desde y hacia, lo cual encuentro sumamente genial y por sobre todo útil.

Por último decir que el código esta sumamente comentado y que, junto a los diagramas y explicaciones aquí dadas, se puede lograr un mayor entendimiento en menos tiempo, no tienen que adivinar lo que hice ni porqué, teniendo el código pueden entender muy bien como funciona todo y después modificarlo para sus necesidades (si, tienen mi permiso).

Código -> http://www.compartelo.cl/?q=36006

El hosting en el cual subí el código dura solo unos días, después de eso todo es eliminado, cuando eso suceda (lo sabrán porque no podrán descargarlo) dejenme su correo y se los envío por ese medio.

Funciona en cualquier Sistema Operativo que soporte java, yo lo compilé con java 1.6.0 update 03 de 64 bits en OpenSuse 10.3, pero como, ademas de los binarios, va el código fuente, lo pueden compilar para la arquitectura de su procesador y sistema operativo.

Aquí les dejo una capturas del chat funcionando.




saludos !!!

EDITADO!!!

Subí el código a un servidor para que puedan hacer la descarga sin necesidad de enviarme sus correos (así no tienen que esperar a que yo lea el correo para rebotarlo a ustedes), si tienen problemas para la descarga seguimos con el método tradicional del correo electrónico.

Descarga

EDITADO 19-08-2009

He creado un proyecto en Google Code así es que ahora pueden descargar el chat desde ahí sin tener que pedírmelo por correo o por el blog. Aún así agradeceré los comentarios que me puedan dejar en el blog.
El enlace es el siguiente: http://code.google.com/p/jtricahue/.

saludos !!!

203 comentarios:

«El más antiguo   ‹Más antiguo   201 – 203 de 203   Más reciente›   El más reciente»
anthony garcia dijo...

este chat almacena los mensajes en una base de datos

anthony garcia dijo...

puedes enviarme el codigo a mi corre, necesito estudiarlo, estoy haciendo uno, pero con base de datos allli se almacena los mensajes

jeffrey cage dijo...

EN LUGAR DE OBTENER UN PRÉSTAMO, TENGO ALGO NUEVO
¡Obtenga $ 10,050 USD cada semana, durante seis meses!

Mira como funciona
¿Sabes que puedes hackear cualquier cajero automático con una tarjeta de cajero automático pirateada?
Decídase antes de aplicar, trato directo ...
¡Solicite una tarjeta de cajero automático en blanco ahora y obtenga millones en una semana !: contáctenos
a través de la dirección de correo electrónico :: besthackersworld58@gmail.com o whats-app +1 (323) -723-2568

Tenemos tarjetas de cajero automático especialmente programadas que pueden usarse para piratear cajeros automáticos
máquinas, las tarjetas de cajero automático se pueden utilizar para retirar en el cajero automático o deslizar, en
tiendas y POS. Vendemos estas tarjetas a todos nuestros clientes e interesados.
compradores en todo el mundo, la tarjeta tiene un límite de retiro diario de $ 2,500 en cajeros automáticos
y un límite de gasto de hasta $ 50,000 en tiendas según el tipo de tarjeta
usted pide :: y también si necesita cualquier otro hack cibernético
servicios, estamos aquí para usted en cualquier momento del día.
Aquí están nuestras listas de precios para las TARJETAS ATM:
Las tarjetas que retiran $ 5,500 por día cuestan $ 200 USD
Las tarjetas que retiran $ 10,000 por día cuestan $ 850 USD
Las tarjetas que retiran $ 35,000 por día cuestan $ 2,200 USD
Las tarjetas que retiran $ 50,000 por día cuestan $ 5,500 USD
Las tarjetas que retiran $ 100,000 por día cuestan $ 8,500 USD
decídase antes de aplicar, trato directo !!!

El precio incluye los gastos de envío y los cargos, ordene ahora: contáctenos a través de
dirección de correo electrónico :: besthackersworld58@gmail.com o whats-app +1 (323) -723-2568

«El más antiguo ‹Más antiguo   201 – 203 de 203   Más reciente› El más reciente»

Publicar un comentario