Crea tu propio chat – Especificación

Publicado por Alejandro Escario en

Continuando con la serie de artículos con los que vamos a explicar como hacer un chat muy simple, vamos a comenzar, con este artículo como el primero a comentar el contenido de cada uno de los archivos que hemos visto en el artículo anterior (Construye tu propio chat – Estructura).

En este artículo vamos a comentar el contenido de los ficheros de especificación y compilación del programa:

README:

Archivo en el que se especifica el funcionamiento del chat a grandes rasgos y comentando todas las funcionalidades del mismo.

El objetivo de este programa 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

INSTALL:

En este fichero comentamos los requisitos mínimos para poder compilar y ejecutar el chat, así como la metodología para compilarlo.

REQUISITOS
libssl-dev
libsqlite3-dev

máquina virtual java para ejecutar la interfaz, hay que dejar claro que no es obligatoria
para el funcionamiento básico de la práctica

INSTALACION
Para compilar los fuentes en los que se entrega el código fuente,
basta con ejecutar desde consola el comando ‘make’, el cual ejecutará
por nosotros:

gcc -lpthread -ldl -lssl -lcrypto -lsqlite3 -Wall -o serv5 serv5.c servFunctions.c database.c type.c tools.c
gcc -Wall -o cli5 cli5.c type.c tools.c
gcc -lpthread -ldl -lssl -lcrypto -lsqlite3 -Wall -o createDB createDB.c database.c tools.c type.c
gcc -Wall -o interfaz interfaz.c type.c

Compilando por nosotros los programas cliente (cli5) y servidor
(serv5)

ARCHITECTURE:

Éste es un fichero en el que especificaremos la estructura de nuestro programa, orientado sobre todo a gente que tenga un poco de conocimiento a la estructura de capas y comentando de manera superficial el funcionamiento de las cosas.

***********
** CAPAS **
***********
En estas primeras entregas, nuestra aplicación consta de 2 capas, una de
presentación y una lógica, correspodiéndose la capa lógica con el servidor y la
capa de presentación de la aplicación cliente.

CLIENTE

El cliente, se encarga de, dado un mensaje que lee de teclado, encapsular el
mensaje y enviárselo al servidor, así como de realizar el proceso inverso, es
decir, partiendo de un paquete, extraer la información y presentársela al
usuario mostrando una interfaz relativamente amigable y clara.

El intercambio de mensajes entre cliente y servidor se realiza mediante paquetes
que aceptan una serie de parámetros que los programas se encargan de encapsular
y desencapsular.

SERVIDOR

En el servidor, se encuentra la parte lógica de la aplicación, es el lugar desde
el cual se controlan los usuarios conectados, revisando que en ningún momento
haya más de un usuario con el mismo nick, que los mensajes que recibe están bien
formados, así como de hacer un reparto de los mensajes que recibe del cliente
hacia el resto de clientes.

SQLITE

El servidor interactua con SQLite para obtener datos de un sistema de almacenamiento
masivo.

********************
** IMPLEMENTACIÓN **
********************

Tanto cliente como servidor están implementados en el lenguaje de programación
C y, disponibles hasta el momento sólo para equipos Unix

CLIENTE

El cliente está compuesto por los archivos cli5.c, y una serie de librerías
que comparte con el servidor, en este caso, sms.h, trace.h, socket.h y flags.h

SERVIDOR

El servidor, al igual que el cliente, está programado en c y su código está
repartido por varios ficheros, serv5.c y servFunctions.c, y se apoya en las
mismas librerias que el programa cliente y, además en el archivo de cabecera
denominado servFuctions.h, el cual contiene la declaración de las funciones
contenidas en servFunctions.c

BASE DE DATOS

Hacemos uso de SQLite para almacenar los datos que han de persistir entre sesiones

LIBRERÍAS COMUNES

sms.h – contiene la estructura que se utiliza para la comunicación entre los
diferentes procesos

socket.h – contiene la estructura con la que identificaremos las diferentes
conexiones

flags.h – contiene los flags que se utilizarán en nuestros mensajes

trace.h – contiene una macro para imprimir mensajes en el caso de estar aun en
fase de desarrollo, de manera que si se desean habilitar los mensajes de
depuración, basta con definir la constante DEBUG con un valor de 1

Makefile:

Este es el primero fichero de gran importancia que vamos a analizar, y es que es el fichero que nos permitirá compilar todos los programas con un único comando:

~$ make

El contenido del fichero es el siguiente:

do: console

console:
gcc -lpthread -ldl -lssl -lcrypto -lsqlite3 -Wall -o serv5 serv5.c servFunctions.c database.c type.c tools.c
gcc  -lssl -Wall -o cli5 cli5.c type.c tools.c ssl.c
gcc -lpthread -ldl -lssl -lcrypto -lsqlite3 -Wall -o createDB createDB.c database.c tools.c type.c
gcc -Wall -o interfaz interfaz.c type.c

Aquí, lo que estamos especificando, es que queremos ejecutar lo que hay en la etiqueta Console.

Gracias al uso de este tipo de archivos, somos capaces de compilar, en este caso, cuatro programas con un solo comando.

Recuerda que si quieres 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.