« | »
Jun'10
13

Hoy en día, pocos son los que no conocen o hacen uso asiduo de los chats instantáneos, estén o no basados en estándares abiertos, pero ¿Cómo funciona un chat de este estilo?, ¿Es fácil hacer uno?. En este artículo vamos a intentar responder a estas preguntas así como dotarla de ejemplos para que al final seamos capaces de crear nuestro propio chat con SSL.

¿Cómo funciona un chat?

La respuesta es muy sencilla, al menos si no profundizamos en el tema, y es que, un chat es algo tan sencillo como dos procesos que intercambian datos entre sí. Comúnmente, estos procesos están situados en diferentes lugares, por ejemplo tenemos un proceso en el cliente, que es o debe ser una mera interfaz que se encargue de enviarle datos al otro proceso (servidor) y dejarle que este haga lo que tenga que hacer con ellos.

¿Porqué hablamos de SSL en un chat?

Muchos chats de los que utilizamos hoy en día, envían datos  por la red sin cifrar, lo que permite que un usuario malintencionado y que se sitúe entre el cliente y el servidor, sea capaz de, sin mucho problema, recoger los paquetes que pasen por ese puntos y leer su contenido.

¿Qué hay que tener en cuenta a la hora de implementar un chat?

Como ya hemos mencionado con anterioridad, vamos a trabajar con un mínimo de dos procesos, un proceso cliente y un proceso servidor, el primero de ellos viene a ser lo que un navegador a una aplicación web, ha de ser capaz de, en la medida de lo posible, dedicarse exclusivamente a mostrar los datos recibidos desde el mismo, mientras que el proceso servidor, es el que, en un principio habría de dedicarse a recibir peticiones, procesarlas y devolver una respuesta con el resultado si es que ha de hacer esto, en nuestro caso, el servidor, al recibir una petición ( un mensaje en este caso ), la analiza, detecta a quién va dirigida y se la envía a los destinatarios, los cuales estarán corriendo otros procesos cliente.

¿Qué tipos de comunicación se pueden dar en un chat?

Un usuario con los privilegios suficientes, habría de ser capaz de darle órdenes directas al servidor, de manera que así, el proceso servidor se pueda ejecutar como un demonio, en este caso, la comunicación sería unicast y unidireccional o bidireccional, dependiendo de lo que se desee hacer.

Un usuario que desee enviarle un mensaje privado a otro usuario conectado al chat, en este caso el usuario A le enviaría un mensaje al servidor con un identificador del usuario al que quiere enviarle el mensaje, el servidor, una vez haya comprobado que el usuario existe y que puede recibir mensajes privados, debe enviarle el mensaje que ha recibido del cliente A al cliente B.

Un usuario que desee enviarle un mensaje a una serie de usuarios que estén conectados al mismo, como por ejemplo en el caso de que se encuentre en una sala de chat específica.

Un usuario desea hacer un broadcast (enviarle un mensaje a todo el mundo) con un determinado mensaje.

En estos dos últimos casos, el mensaje se le envía al servidor con los flags (indicadores de la actividad que se realiza) necesarios activados para que sepa qué hacer con cada mensaje y se reenvía el mensaje a los destinatarios seleccionados.

¿Como podemos ver el funcionamiento de un chat de este estilo?

Tanto Microsoft, Google como otras empresas y usaurios han desarrollado unas estupendas herramientas para mantenernos conectados en tiempo real, pero dado que o bien no tenemos acceso al código funete de determinadas aplicaciones ( cliente/servidor ), o que no utilizan un protocolo abierto, o que son muy complicados para empezar a trabajar sobre ellos, para aprender de una manera superficial como funcionan, vamos a crear nuestro propio chat, a continuación os pongo una copia del archivo README para que veáis las funcionalidades del mismo y si os compensa seguir leyendo esta serie de artículos:

El objetivo consite en el desarrollo de un chat mediante el uso de sockets
de internet TCP, por lo que en este caso seremos capaces de comunicarnos mediante
una conexión fiable entre el cliente y el servidor, siendo en este caso el cliente
un cliente múltiple que deberá recibir la información correspondiente a los mensajes
que han enviado el resto de clientes.

MANUAL DE USO

CLIENTE

El cliente es un programa que tras ejecutarlo, nos permite escribir
mensajes y al cliente, los cuales, dependiendo de la sintaxis utilizada
se comportarán en el mismo de una u otra manera, por ejemplo, si escibimos
un mensaje cualquiera, se enviará el mensaje como un mensaje de texto
normal, es decir que deseamos que se envíe al resto de usuarios del chat,
por contra si se escribe uno de los comandos en ejecución se ejecutará
la acción correspondiente y descrita en las siguientes lineas.

Al mismo tiempo, mientras el proceso nos permite enviarle mensajes al
servidor, éste está leyendo constantemente los datos que le llegan desde
el servidor.

Para ejecutar el cliente basta con ejecutar en consola:

./cli5

Si por el contrario deseamos ejecutar el cliente con una interfaz
gráfica, basta con ejecutar, para ejecutarlo hace falta la máquina
virtual java.

./interfaz

Cuando un usuario se conecte, se le mostrarán los nombres de las diferentes
salas a las que puede acceder con cadenas de la siguiente manera

– %s –

Siendo %s, el nombre de la sala, una vez que sepamos a que sala deseamos
conectarnos, tendremos que escribir el nombre de la sala tal cual aparece,
es decir el equivalente a %s

FLAGS

-p indica el puerto por el que nos conectaremos con el servidor

./cli5 -p 12345

-d indica la dirección por la que nos conectaremos con el servidor

./cli5 -d localhost

-cert indica la ruta del certificado a utilizar para conectarse con
el servidor
./cli5 -cert /usr/share/doc/libssl-dev/demos/sign/cert.pem

COMANDOS EN EJECUCIÓN

-x comando aplicable en cualquier momento, es el único comando aplicable
en el proceso de autenticación.

-x # cierra el cliente

–serv lo que se esciba en el siguiente comando, se le envia directamente
al servidor

–serv # nos indica que ahora estamos hablando con el servidor
-x # le enviamos el comando -x al servidor

Para salir del modo de conversación con el servidor (modo durante
el cual no se recibirán los mensajes enviados por el chat) habremos
de escribir ‘exit’, y volveremos al modo de chat tradicional.

SERVIDOR

El servidor es un programa que es capaz de interactuar n clientes, de
manera que estos se conectan a él y este retransmite la información.

Su uso es muy sencillo, ya que una vez ejecutado, podemos olvidarnos de
él, de hecho en el caso de que deseemos ejecutar un comando en ejecución,
hemos de, cargar un cliente y mediante el previo uso del comando
–serv, enviarle uno de los comandos permitidos durante la ejecución
y cuyo comportamiento se detalla a continuación.

En el caso de que al ejecutar el servidor, no se encuentre el fichero con
la base de datos, se creará uno y se solicitarán las credenciales del
administrador en el servidor, tras esto, todo se hará desde el cliente.

Al conectarse con el servidor, y escoger un nombre, si este no está en la
base de datos, el usuario se conectará como invitado, pudiendo sólo
enviar mensajes, si por el contrario el usuario está registrado, se le
solicitará la contraseña y tendrá el rol asignado en la base de datos

Si al ejecutar el cliente nos dice que la base de datos no existe, el
proceso terminará con un error (-1), por lo que deberemos crear dicha
base de datos ejecutando ‘./createdb nombre de la base de datos’.

ROLES
GUEST – invitado, sólo puede enviar mensajes y a su nombre se le
concaternará la cadena de texto ‘-guest’

USER – usuario, sólo puede enviar mensajes

ADMIN – administrador, además de enviar mensajes, es capaz de enviarle
comandos al servidor

FLAGS

-p indica el puerto por la que habrán de conectarse los clientes

./serv5 -p 12345

-ls indica el tamaño inicial de la lista de clientes

./serv5 -ls 100

-lg indica el factor de crecimiento de la cola

./serv5 -lg 10

-db indica el nombre de la base de datos con la que se va a interactuar

./serv5 -db chat.db

-cert indica la ruta del certificado a utilizar para conectarse con
el servidor
./serv5 -cert cert

-pkey indica la ruta de la clave privada de la que hará uso el servidor

./serv5 -pkey pkey

COMANDOS EN EJECUCIÓN estos comandos vienen desde el cliente, sólo será
capaz de comunicarse con el servidor aquellos usuarios que tengan el
rango de administrador.

-x cierra el servidor

–add-user name password [rol]
Este comando, creará un usuario con nombre ‘name’, contraseña
‘password’ y el rol indicado, por ahora se admiten los roles de
‘admin’ y ‘user’, en caso de no especificar el campo rol, el
usuario creado le srá asignado el rol ‘user’. No se podrán
crear dos usuarios con el mismo nombre.

–delete-user name
Este comando borra el usuario cuyo nombre coincida con el valor
‘name’

–list-user
Este comando lista todos los usuarios registrados en el chat

–log
Este comando imprime todas las ocurrencias del log si no se le
pasan parámetros

Se le pueden pasar dos parámetros, fecha de inicio y fecha de fin

–log dd/mm/YYYY dd/mm/YYYY

en cuyo caso se listarán sólo los log entre dos fechas

–mp [nombre]
Este comando le envía un mensaje privado al usuario llamado nombre,
el mensaje se escribirá después de haber pulsado intro después
de esta cadena.

–mp admin
mensaje para el administrador

Le envia un mensaje privado al administrador cuyo contenido es
‘mensaje para el administrador’

–add-room [nombre]
Este comando añade una nueva sala de chat llamada [nombre]

–list-room
Este comando lista todas las salas de chat

–delete-room [nombre]
Este comando borra una sala de chat llamada [nombre] y mueve los
usuarios que se encontraban en esta a la sala general

CREATEDB

Proceso que crea la base de datos con un usuario administrador.

Sólo admite un parámetro que es obligatorio y que tiene el nombre de
la base de datos a crear, es aconsejable llamar a la base de datos
chat.db ya que es el nombre por defecto de la base de datos a la que
intenta conectarse el servidor

./createDB chat.db

El ejemplo de chat que vamos a crear está desarrollado en C bajo un entorno Unix, más concretamente Linux, y para dotarle de una interfaz gráfica, nos hemos aprovechado de las bondades del sistema de pipes unix para implementarla rápidamente en java.

Descarga:

Link: SCI-Chat

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): C/C++, Java, Linux, Producción propia, Programación
Si te gustó este artículo o bien deseas seguirnos diariamente tal vez desees suscribirte a nuestro canal RSS vía email o bien vía lector de feeds. Recuerda que si usas tu email debes verificar la activación de tu suscripción (si tarda mucho revisa en tu carpeta spam).
Puedes dejar un comentario, o hacer un Trackback desde tu sitio.

18 comentarios en “¿Cómo funciona un chat? – Introducción”

  1. [...] « ¿Cómo funciona un chat? – Introducción | Jun14 Construye tu propio chat – Estructura Escrito por Alejandro [...]

  2. [...] echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al primer artículo de la serie de artículos que tratan el tema del chat. AKPC_IDS += [...]

  3. [...] hemos comenzado a hacer en el artículo anterior, vamos a continuar comentando los ficheros que lo componen uno a uno, en este artículo vamos a [...]

  4. [...] echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al primer artículo de la serie de artículos que tratan el tema del chat. AKPC_IDS += [...]

  5. [...] unos días comentando las características que ha de tener un chat y de cuales son las estructuras básicas en las que podríamos basarnos para crear nuestro propio [...]

  6. [...] echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al primer artículo de la serie de artículos que tratan el tema del chat. AKPC_IDS += [...]

  7. [...] este artículo termina la serie de artículos en las que describimos los principios básicos que hay que tener en cuenta para realizar un chat y en los que también se describe como hacer una [...]

  8. Richard says:

    uhmm!!! pucha seria bueno si lo explicaras de forma general para poder saber como hacer el funcionamiento de una sala de chat en Adobe Flex Builder y Adobe AIR 2.0 … como tambien para plataformas como HTML y PHP

    • Hombre, el funcionamiento general creo que está explicado, de todos modos, entre lenguajes hay un mundo para implementar cosas de estas, así a bote-pronto, una aproximación para hacerlo en PHP o en cualquier plataforma web sería o bien hacer pulling utilizando ajax, el resto es facil,… de todos modos decidí explicar este método por que el manejo de sockets en C no es algo tan trivial como pueda ser en java o bien hacer una llamada asíncrona al servidor desde cualquier plataforma web.

      De todos modos tomo nota, e intentaré hacer los ejemplos que se proponen en tu comentario.

  9. javier says:

    como andan? alguien me podria decir como lo testeo y lo hago funcionar en mi ubuntu? gracias

    • Una vez que te lo descargas, tienes que ejecutar desde consola el comando “make”, esto compilará el cliente y el servidor.
      Tras esto, en una terminal, ejecuta el servidor y, desde otra al cliente con los parámetros deseados. Cada uno de los parámetros está detallado en el propio artículo :)

  10. julio says:

    Hola, quiero bajar el código pero aparece

    Descarga:
    Link: [download id="2"]

    Si hay que registrarme en la pagina no encontré donde hacer ese registro, por favor le agradezco a quien solucionar esto.
    Muchas gracias por su tiempo.

  11. julio says:

    Hola, no se puede bajar el codigo, aparece

    Descarga:
    Link: [download id="2"]

    si alguien puede solucionar esto le quedo muy agradecido.

    • esc_89 says:

      Buenos días Julio. Perdón por tardar tanto en responder. Te cuento, me hackearon el blog y estoy, poco a poco haciendo que vuelva a la normalidad. Intentaré que para esta noche esté puesto de nuevo el link!

      gracias por tu paciencia.

  12. julio says:

    Gracias a usted por compartir lo que sabe. Quiero implementar un cliente IRC con sockets en java usando jsp y EJB no quiero hacerlo como aplicación de escritorio y subirlo en un applet.
    Tengo unos inconvenientes por la versión de java 1.4 que corre con Tomcat por defecto en Netbeans, y necesito unas instrucciones que son soportadas por java 5, concretamente arreglos de objetos definidos como

    ArrayList arregloDeStrings;

    pero java 1.4 no soporta eso y se hace un poco mas tedioso. Por eso quiero ver el código para mirar como lo implementan acá.

    Muchas gracias por su respuesta

    • esc_89 says:

      Listo, ya he actualizado el link para su descarga: http://code.google.com/p/sci-clat/

      El programa que aquí comparto está escrito en su mayor parte en C, en Java sólo está programada la interfaz gráfica.

      Para hacer la gestión de conexiones, en Java vas a tener que usar (sólo en el servidor), un sistema de threads.

      Si lo que necesitas es usar clases como ArrayList y no están soportadas en Java 1.4, puedes crear tu propia clase ArrayList extendiendo a la clase List< ?>

  13. julio says:


    ArrayList arregloDeCadenas;

    que pena volver a escribir, esque los blogs omiten algunos caracteres.

  14. julio says:

    ArrayList arregloDeEnteros;

Deje su comentario

XHTML: Puedes utilizar algunos códigos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

« | »