Documente Academic
Documente Profesional
Documente Cultură
AGRADECIMIENTOS
_____
Quiero agradecer a Don Juan Antonio Ternero Muiz, profesor e
investigador en el Departamento de Ingeniera de Telemtica de
la Escuela Superior de Ingeniera de Sevilla, la realizacin del
proyecto. A mi familia el apoyo que me han dado y en especial a
mi novia Sara, por confiar en m y darme nimos en todo
momento.
ndice general
1. Conocimientos previos
1.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1. Compatibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2. Conectividad . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
2. Instalacin y configuracin
10
10
10
11
13
15
16
17
17
19
19
ndice general
2.3. Tipo de Licencia de la aplicacin chat . . . . . . . . . . . . . . . . . .
21
22
25
25
27
4.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
. . . . . . . . . . . . . . . . . . .
29
29
31
31
33
34
35
36
36
38
38
39
39
40
41
41
41
42
43
44
ii
mensaje privado. . . . . . . . . . . . . . . . . . . . . .
44
45
45
46
47
50
ndice general
4.8.1. Envo de mensajes . . . . . . . . . . . . . . . . . . . . . . . . .
50
4.8.2. Optimizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
51
4.10. Emoticonos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
53
5. Alternativas
57
5.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
57
5.2.1. Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
57
58
5.2.4. Qu es BOSH ? . . . . . . . . . . . . . . . . . . . . . . . . . .
58
60
60
61
69
. . . . . . . . . . .
72
/etc/apache2/mods-available/proxy.conf . . . . . . . .
72
73
73
ndice de figuras
75
ndice de cuadros
77
Bibliografa
79
81
81
81
84
iii
ndice general
iv
1 Conocimientos previos
1.1.
Introduccin
Este documento es un proyecto final de carrera realizado por Miguel ngel Cuevas
Cepeda con la colaboracin del tutor, Don Juan Antonio Ternero Muiz. La elaboracin del proyecto tiene por finalidad dos objetivos:
1. La primera es la elaboracin de un documento que permita a Miguel ngel
Cuevas Cepeda realizar el Proyecto Final de Carrera y terminar sus estudios de
Ingeniera de Telecomunicacin.
2. Estudio y desarrollo de un cliente y un servidor de mensajera instantnea
mediante una interfaz web utilizando la tecnologa django1 .
A continuacin se comenta la estructura de la memoria:
Captulo_1 Es una introduccin al Proyecto Final de Carrera, se recogen los objetivos y funcionalidades de la aplicacin implementada.
Captulo_2 Instalacin, configuracin e investigacin de los programas empleados.
Captulo_3 Estudio con Wireshark para el anlisis de las comunicaciones.
Captulo_4 Implementacin de la aplicacin chat para django.
Captulo_5 Programas alternativos analizados e instalados pero no utilizados para
el desarrollo del proyecto.
Hoy en da hay muchas alternativas de chat, tambin llamado clientes de mensajera
instantnea, por ejemplo, windows live messenger 1.1a, clientes de mensajera libres
(open source) como pidgin 1.1b, eMesene 1.1c, etc.
1
1 Conocimientos previos
(b) Pidgin
(c) eMesene
1.2.
1.2.1.
Compatibilidad
A partir de ahora cuando se hable de cliente, se har alusin a un cliente de mensajera instantneo
o chat.
1.2.2.
Conectividad
Conexin del cliente al servidor (django), se puede iniciar desde cualquier punto
de la red o internet, basta con tener acceso a una conexin TCP/IP (con un puerto
dado3 ).
1.2.3.
Seguridad de la conectividad
1.2.4.
Ms adelante se describir con mayores detalles las conexiones y protocolos que se utilizarn.
1 Conocimientos previos
Una pestaa Setup para entrar como Administrador y aadir o eliminar
usuarios del chat.
Informacin adicional en el chat como la fecha y hora de la ltima recepcin de
un mensaje escrito otro usuario.
Todas las caractersticas anteriores se han contemplado para este proyecto. Se ir
describiendo con mayor profundidad en los siguientes captulos.
1.2.5.
Funcionalidades avanzadas
1.2.6.
X
X
X
X
X
X
X
X
X
1.3.
Fundamentos previos
Esta seccin va dedicada a los nuevos conocimientos adquiridos a lo largo del proyecto. Es muy importante resaltar que gran parte del tiempo que se le ha dedicado
a este proyecto ha sido a la obtencin de nuevos lenguajes de programacin y a la
investigacin.
En el caso de los lenguajes de programacin se complet su lectura con los ejercicios
que iban plantendose. En el CD Suplementario hay una carpeta por cada lenguaje
con las soluciones de cada ejercicio.
Los nuevos conocimientos adquiridos durante el desarrollo del proyecto son los
siguientes:
Lenguaje de programacin JavaScript.
Ver referencia [9]
1 Conocimientos previos
Enlace web al libro utilizado:
http://www.librosweb.es/javascript/index.html
JavaScript se utiliza en el lado cliente, en este caso, implementado en el navegador
web permitiendo mejoras en la interfaz de usuario y posibilitando una web dinmica.
Lenguaje de programacin Python.
Ver referencia [10]
Enlace web al libro utilizado:
http://mundogeek.net/tutorial-python/
Se recuerda que el proyecto tiene por objetivo el uso de la tecnologa django. django
est escrito en cdigo python, es por ello el estudio del mismo. Python es un lenguaje
de programacin de alto nivel cuya filosofa hace hincapi en una sintaxis muy limpia
y que favorezca un cdigo legible.
Lenguaje de programacin XHTML para la creacin y modificacin de pginas
web.
Ver referencia [11]
Enlace web al libro utilizado:
http://www.librosweb.es/xhtml/index.html
Uso de la tecnologa AJAX.
Ver referencia [12]
Enlace web al libro utilizado:
http://www.librosweb.es/ajax/index.html
Framework Web django, provee de una infraestructura de programacin para
aplicaciones.
Ver referencia [13]
Enlace web al libro utilizado:
http://es.scribd.com/doc/61814981/El-Libro-de-Django
1 Conocimientos previos
2 Instalacin y configuracin
ste captulo trata la instalacin y la configuracin del cliente. Adems, se explica
el proceso de instalacin del servidor as como las dependencias del mismo.
La instalacin del servidor se ha realizado en una nica mquina. Si se quiere
instalar en otra, los pasos sern los mismos, aunque hay que tener cuidado con la
arquitectura del ordenador utilizado, ya que, ste puede ser distinta. Se remite al
lector ver su arquitectura y actuar en consecuencia. Las referencias a los binarios
(ejecutables), que aqu se comentan, para la instalacin se refieren a los que se han
utilizado para realizar este proyecto.
Con respecto al cliente, el nico requisito es tener instalado un navegador web1 .
Las especificaciones de la arquitectura se nombra a continuacin2 :
Nombre de la especificacin
Tipo
Sistema Operativo
Ubuntu 9.10 - Karmic Koala Tipo de Arquitectura
i386
Cuadro 2.1: Especificaciones de la arquitectura utilizada en este proyecto
2.1.
Requisitos software
Estas son las aplicaciones que se han instalado para el funcionamiento del servidor:
Instalacin de Python (v.2.6.4): Subseccin 2.2.1
Instalacin de Django (v.1.1.1): Subseccin 2.2.2
Instalacin de Apache (v2.2.12): Subseccin 2.2.3
1
Para este proyecto es indiferente el navegador web utilizado, aunque ms adelante se hablar que
con el navegador web internet explorer, en cualquiera de sus versiones, se tiene la posibilidad
aadida de guardar las conversaciones.
2
La distribucin de Ubuntu 9.10 fue publicada en Octubre de 2009 y soportada hasta Abril de
2011. Este proyecto tuvo una duracin de 6 meses correspondiente al perodo comprendido entre
febrero - julio 2011, por ello la distribucin linux utilizada.
2 Instalacin y configuracin
2.2.
2.2.1.
Instalacin de Python
El cdigo de django est 100 % escrito en puro python as que lo primero que se
necesita es instalar python. Python se encuentra en los paquetes de cualquier sistema
operativo basado en GNU/Linux. Para la instalacin de python en ubuntu (debian)
9.10 se teclea lo siguiente en un terminal3 :
# python
# Python 2.6.4 ( r264 :75706 , Dec 7 2009 , 18:45:15)
[ GCC 4.4.1] on linux2 Type " help " , " copyright " , " credits " or
" license " for more information .
>>>
2.2.2.
Instalacin django
Cuando se trate temas relacionados con la intalacin, configuracin o edicin de ficheros se necesitan
privilegios de administrador.
10
2.2.3.
El servidor HTTP Apache es un servidor web HTTP de cdigo abierto, para plataformas Unix (BSD, GNU/Linux, etc.), Microsoft Windows, Macintosh y otras, que
implemente el protocolo HTTP/1.1 y la nocin de sitio virtual.
Para la instalacin de Apache en ubuntu (debian) 9.10 como servidor de pginas
web hay que teclear en el terminal:
mod_wsgi
mod_python
Para ste proyecto se ha decantado por el primero de los procedimientos. Una explicacacin de por qu, es que el mod_wsgi usa menos memoria y est preparado para
sitios con mayores exigencias. En la figura 2.1 se observa la arquitectura utilizada
y la ubicacin del mdulo como comunicador entre el servidor Apache y el servidor
django:
11
2 Instalacin y configuracin
mod_wsgi es similar a mod_perl, hace que se pueda utilizar cdigo python en Apache y cargar cdigo python en memoria cuando el servidor arranca. El codigo
permanece en memoria segn el ciclo de vida de un proceso en el servidor Apache, esto hace aumentar el rendimiento frente a otro tipo de servidores. Django
funcionar con cualquier version de Apache que soporte mod_wsgi.
Para la instalacin de ste mdulo se teclea en el terminal:
12
2.2.3.1.
Para que la explicacin sea ms clara, con el comando ls -l se va a listar los ficheros
y carpetas que contiene la ruta /etc/apache2:
# / etc / Apache2$ ls -l
total 80
-rw -r - -r - - 1 root root 8097 2010 -11 -18 22:16 Apache2 . conf
drwxr - xr - x 2 root root 4096 2011 -02 -08 12:40 conf . d
-rw -r - -r - - 1 root root
551 2010 -11 -18 22:16 envvars
-rw -r - -r - - 1 root root
125 2011 -03 -10 13:09 httpd . conf
-rw -r - -r - - 1 root root 31063 2010 -11 -18 22:16 magic
drwxr - xr - x 2 root root 4096 2011 -03 -10 13:07 mods - available
drwxr - xr - x 2 root root 4096 2011 -03 -10 13:06 mods - enabled
-rw -r - -r - - 1 root root
513 2011 -03 -09 10:49 ports . conf
-rw -r - -r - - 1 root root
513 2011 -03 -09 09:53 ports . conf . backup
drwxr - xr - x 2 root root 4096 2011 -03 -09 14:24 sites - available
drwxr - xr - x 2 root root 4096 2011 -03 -09 13:35 sites - enabled
En esta ruta se crea el nuevo fichero (site), llamado django-chat. El cdigo a escribir
es el siguiente:
13
2 Instalacin y configuracin
Y se activa el site:
# sudo ln -s
/ etc / Apache2 / sites - available / django - chat
/ etc / Apache2 / sites - enabled / django - chat
.....
PythonPath
"[ / home / miguel / Documentos / djcode / django_chat / chat / ,
/ home / miguel / Documentos / djcode / django_chat / dojango / ,
/ home / miguel / Documentos / djcode / django_chat / ,
/ home / miguel / Documentos / djcode ] + sys . path "
.....
14
Para esta configuracin se crea, al igual que el anterior, un nuevo site. Se edita el
archivo default que viene por defecto en la instalacin de Apache:
15
2 Instalacin y configuracin
[..]
</ VirtualHost >
2.2.4.
Se tiene que tener tambin cuidado con el tipo de licencia ofrecida por el autor de dicho cdigo libre.
Existen multitud de aplicaciones libres con diferentes licencias, algunas ofrecen una completa
liberacin del mismo de forma que se puede modificar la totalidad del cdigo adems con la
posibilidad de comerciar con l. Otros programadores en cambio ofrecen el cdigo pero sin una
comercializacin del mismo.
16
Una vez que las aplicaciones se han descargado, se descomprimen. Importante: Renombramos la carpeta descomprimida de django-chat-0.2 a django_chat. Se recalca
que estos pasos son diferentes a los que el autor proporciona en la pgina web oficial.
#
#
#
#
#
u n z i p djangochat 0 . 2 . z i p d django_chat
t a r x v z f dojango 0 . 3 . t a r . gz
mkdir d j c o d e
mv django_chat . / d j c o d e /
mv d o j an go . / d j c o d e / django_chat /
2.2.4.2.
Segn la gua de instalacin de la pgina web del desarrollador se pide crear una
base de datos. Por defecto en el archivo setting.py viene preconfigurada la base de
17
2 Instalacin y configuracin
datos sqlite(sql3). Para este proyecto, la base de datos que utilizaremos ser MySQL.
MySQL, ademas de ser software libre, es un sistema gestor de bases de datos relacional, multihilo y multiusuario con ms de seis millones de instalaciones.
Teniendo instalado MySQL5 se crea una base de datos y se configura los parmetros
del archivo /django_chat/settings.py:
DATABASE_ENGINE = mysql
DATABASE_NAME = chatdb
DATABASE_USER = admin
DATABASE_PASSWORD = c h a t
DATABASE_HOST =
DATABASE_PORT = 3 3 0 6
# p o s t g r e s q l _ p s y c o p g 2 , p o s t g r e s q l , mysql ,
s q l i t e 3 or oracle .
# Or path t o d a t a b a s e f i l e i f u s i n g s q l i t e 3 .
# Not u s e d w i t h s q l i t e 3 .
# Not u s e d w i t h s q l i t e 3 .
# S e t t o empty s t r i n g f o r l o c a l h o s t . Not u s e d w i t h
sqlite3 .
# S e t t o empty s t r i n g f o r d e f a u l t . Not u s e d w i t h
sqlite3 .
18
# python manage . py r u n s e r v e r
Este paso es caracterstico en django. Se remite al lector consultar la bibliografia para ms informacin.
8
Usuario de la base de datos chatdb
9
Contrasea de la base de datos chatdb
19
2 Instalacin y configuracin
20
2.3.
21
2 Instalacin y configuracin
2.4.
..........
< script type =" text / javascript " >
// dojo . requires ()
dojo . require (" dojox . layout . FloatingPane ");
dojo . require (" dijit . form . TextBox ");
dojo . require (" dijit . form . Button ");
dojo . require (" dojo . parser ");
// scan page for widgets
// scan page for widgets and instantiate them
dojo . require (" dojo . parser ");
function chat_update () {
var wait = 30000 < - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dojo . xhrGet ({
url : "./ update " ,
handleAs : " json " ,
load : function ( data , ioargs ) {
dojo . byId (" messages "). innerHTML = data . users +
<hr > + data . messages ;
wait = data . wait_value * 1000
setimeout ( chat_update , wait )
..........
22
23
2 Instalacin y configuracin
24
25
26
4 Modificaciones en la aplicacin
django-chat
4.1.
Introduccin
Los captulos anteriores hablaban sobre los conocimientos adquiridos al inicio del
desarrollo del proyecto y la instalacin de los programas necesarios. El tiempo dedicado a ello fue largo y montono pero es un trabajo que haba que dedicarle. En casi
todo los proyectos finales de carrera el inicio es el ms duro pero una vez desarrollado
este trabajo, la situacin se encauza y se hace ma ameno.
ste captulo trata sobre las modificaciones necesarias que se le ha tenido que
adaptar a la aplicacin chat para llegar al objetivo final. Se recuerda que el objetivo
final es la comunicacin entre un cliente que utiliza un navegador web con javascript
y un servidor Apache que a su vez interacta con el servidor de aplicaciones django.
Pero para llegar a este objetivo hay modificaciones importantes en el cdigo. Estas
modificaciones se detallan en los siguientes apartados. Se va a resumir en los siguientes
prrafos las modificaciones realizadas.
Primeramente se restringi los usuarios que accedan a la aplicacin chat, usuarios
registrados en la base de datos y usuarios invitados con menos privilegios sin necesidad
de registro, y es por tanto, el requisito de un password para los usuarios registrados.
Esta forma de entrada no se proporcionaba, si no que por el contrario, el password
segn el autor era el canal al cual se quera acceder, se ve que es un cambio bastante
abrupto. En la figura 4.1 se tiene un resumen de las nuevas caractersticas.
27
28
4.2.
4.2.1.
invitado Usuario no registrado en la base de datos. Puede hacer uso del programa
chat. La diferencia ms significativa es el nombre con el que entra al programa
chat. El servidor realiza una serie de mecanismos para asignarle un nombre
de usuario del tipo invitado-XXX. Donde XXX ser una serie de letras en
mayscula y minscula aleatorias. Con respecto al password, tampoco tendr
que teclear nada, el servidor le asignar una.
29
Se ha sacado la eleccin del canal del registro de usuario, para selecionarlo en otra
pgina web distinta. Se ha conseguido de esta forma no modificar cdigo interno de
django1 . La siguiente imagen muestra la eleccin del canal al cual se quiere conectar
el usuario.
Si en la pgina web de registro de usuario (usuario, password) se aade otro campo, canal, hay que
modificar cdigo interno de django, es decir, ficheros de configuracin de django. Por ello se ha
escogido otro camino diferente para la misma finalidad. Este proyecto se ha escrito de manera que,
el cdigo sea portable a otros sistemas que esten en funcionamiento y que no alteren el mismo.
30
4.2.2.
4.2.2.1.
Modificacin de ficheros
Fichero ../django_chat/backends/passgroup.py
1. Se quera conseguir tener una secuencia de invitados para definir el nombre con
el que entraba al chat, en vez de la serie de letras XXX que hemos adoptado finalmente. Leyendo manuales de python recomiendan no crear variables globales
(evitar a toda costa).
2. El segundo aspecto es un poco ms difcil de explicar. Para ser breve, se han
incluido nuevos campos en el modelo de UserData del fichero de modelos ../django_chat/chat/models.py .
31
Donde:
user: usuario registrado en la BBDD por el administrador.
last_req: fecha con la hora de la ltima solicitud. Traspasado un tiempo y si el cliente
no da sntomas de estar conectado, se le desconectar.
refresh_period: periodo de refresco de actualizacin del cliente chat.
disconnected: de tipo booleano que indica si se ha desconectado desde alguna mquina donde inici sesin.
canal: canal del usuario al cual est conectado.
Hay que comentar que un usuario registrado puede loguearse en ms de un equipo, las
conversaciones que ir teniendo aparecer en todos los equipos donde tenga abierta
la pgina chat. Se ha cambiado el cierre de la pgina de forma que, podamos abrir
en distintas mquinas el mismo usuario, pero si cerramos una, inmediantamente se
32
Template: ../django_chat/chat/templates/login.html
"""
< div id =" content - main " >
< form action ="{{ app_path }}"
33
< input type =" password " name =" password " id =" id_password " value =""/ >
</ div >
< div class =" submit - row " >
< input type =" submit " value ="{ % trans Log in %}"/ >
< input
type =" reset " name =" limpiar " value =" Limpiar Campos "
onclick =" document . formulario . username . value = ;
document . formulario . password . value = ;
document . formulario . username . readOnly = false ;
document . formulario . password . readOnly = false " / >
</ div >
</ form >
</ div >
"""
4.2.2.3.
Template: ../django_chat/chat/templates/test.html
34
Fichero ../django_chat/chat/views.py
El usuario cierra la conexin con el servidor, cerrando las sesiones que tenga abiertas
en otras mquinas. Adems se ha agregado la siguiente lnea en el archivo ../django_chat/urls_prefix.py:
Con esta lnea indicamos, que si nos pide la url, por ejemplo,
localhost:8000/chat/admin/logout/
ejecute la funcin definida en django_chat.chat.views.logout que es la funcin anteriormente descrita.
35
4.3.
Uso de LDAP
Para utilizar LDAP en nuestra aplicacin chat con Django, vamos a seguir la documentacin que nos proporciona la siguiente direccin web:
http://packages.python.org/django-auth-ldap/
LDAP proporciona el backends o la autenticacin en proyectos djangos en cualquier servidor LDAP. Para usarlo, se debe agregar la siguiente lnea en el archivo de
configuracinn settings.py:
......
A UT H EN TI C AT I ON _B A CK E ND S = (
# django_auth_ldap . backend . LDAPBackend ,
django_chat . backends . passgroup . GroupBackend ,
django . contrib . auth . backends . ModelBackend ,
)
......
hay que eliminar el # (que comenta la lnea) para que se conecte con un servidor
LDAP.
4.3.1.
......
# AUTH_ LDAP_SERVER_URI = " ldap :// ldap . example . com "
......
36
......
import ldap
from django_auth_ldap . config import LDAPSearch
......
AUT H_LDAP_BIND_DN = ""
A U T H _ L DA P _B IN D _P A SS W OR D = ""
A U T H _ L D AP_U SER_S EARC H = LDAPSearch (" ou = users , dc = example , dc = com " ,
ldap . SCOPE_SUBTREE , "( uid = %( user ) s )")
......
......
A U T H _ L D A P _ U S E R _ D N _ T E M P L A T E = " uid = %( user )s , ou = users , dc = example , dc = com "
......
37
......
AUTH_LDAP_START_TLS = True
......
4.3.2.
4.3.3.
En la anterior subseccin se ha comentado el uso de LDAP as como su instalacin. A continuacin se va a explicar otras caractersticas adicionales que no se han
comentado y es fundamental, ya que sin estos no funcionara.
38
4.3.3.2.
39
Al cambiar la autenticidad para usar LDAP los usuarios invitados no tenan permisos para entrar al chat sin autenticarse. Este fallo ha sido solventado adoptando la
siguiente medida.
Se recuerda que para autenticar a un usuario mediante LDAP introducimos en el
archivo settings.py las siguientes lneas:
......
A UT H EN TI C AT I ON _B A CK E ND S = (
django_auth_ldap . backend . LDAPBackend ,
django . contrib . auth . backends . ModelBackend ,
)
......
......
A UT H EN TI C AT I ON _B A CK E ND S = (
django_auth_ldap . backend . LDAPBackend ,
django_chat . backends . passgroup . GroupBackend ,
django . contrib . auth . backends . ModelBackend ,
)
......
40
4.4.
4.4.1.
4.4.2.
Al hacer click en el icono que est junto al usuario remoto al que se quiere realizar una llamada, se ejecuta una serie de cdigo JavaScript que modifica este icono,
41
Interaccin entre el cdigo JavaScript del cliente y el cdigo Python del servidor
mediante variables. Estas variables son guardadas en las bases de datos, y cada usuario
tendr una. Las variables son definidas en el modelo como sigue:
......
remote_user = models . CharField ( default =" inactivo " , max_length =255)
status_call = models . IntegerField ( default =0)
......
Donde:
remote_user: guardar el nombre del usuario remoto, con el que realiza la videollamada. Es decir, Miguel tiene en la base de datos una variable remote_user =
sara. Sara tendr su variable remote_user = miguel. Esto nos sirve para ver con
quin est hablando, adems, si la variable remote_user != inactivo (palabra
reservada), cualquier otro usuario podr realizar una videollamada sabiendo
que no est hablando con nadie. Principalmente el objetivo es ese, que otro
42
4.5.
43
4.5.1.
La pantalla de edicin del mensaje estar escondida para el usuario a menos que el
usuario haga doble click con el ratn en uno de los usuarios conectados, independientemente en que canal est conectado. Con JavaScript desempearemos esta funcin
de aparicin y desaparicin de dicha ventana.
44
Una vez llegado al servidor el archivo views.py detectar en el campo text que es un
mensaje privado. Cmo?, se ha explicado ms arriba cmo se va a enviar el mensaje
privado, es decir, de la siguiente manera:
......
class UserData ( models . Model ):
"""
"""
user = models . ForeignKey ( User , unique = True )
last_req = models . DateTimeField ( default = datetime . now ())
refre sh_perio d = models . IntegerField ( default =5)
connected = models . BooleanField ( default = False )
disconnected = models . BooleanField ( default = False )
45
4.6.
46
4.7.
Esta barra deslizadora ha sido tambin una creacin propia, gracias al estudio de javascript.
47
El problema consista en: un movimiento nulo cuando se actualizaban las conversaciones, es decir, otro usuario, o el mismo, escriba en el canal. La barra deslizadora
se quedaba donde estaba sin una visualizacin de las ltimas conversaciones. Para
poder verlas haba que, manualmente, pinchar con el ratn y desplazar la barra hacia
abajo.
La solucin que que ha sido tomada ha sido generar un cdigo JavaScript que
mueve la barra automticamente hacia abajo. El cdigo aadido al archivo test.html
es el siguiente:
......
< script type =" text / javascript " >
function actualizar () {
var objDiv = document . getElementById (" messages ");
objDiv . scrollTop = objDiv . scrollHeight ;
}
</ script >
......
48
......
<! - - Panel Cliente Django - Chat Mensajes - - >
< div dojoType =" dojox . layout . FloatingPane " id =" chatClient "
title =" Cliente Django - Chat Visualizador " resizable =" false "
dockable =" true " closable =" false " style =" width :260 px ;
background :# fff ; position : absolute ; top :200 px ; left :500 px ;" >
< div id =" messages " style =" height :200 px ; overflow : auto ;" >
Cargando mensajes ...
</ div >
</ div >
......
49
4.8.
4.8.1.
Envo de mensajes
4.8.2.
Optimizacin
Se recuerda que el servidor registra las conversaciones que los usuarios escriben.
Cuando se conecta un cliente le aparece en el visualizador de mensajes del canal,
todas las conversaciones que se producen. Un problema que tena el servidor es que
actualiza completamente la pantalla del cliente envindo nuevamente informacion
(conversaciones) que ya dispona el usuario, informacin que sobrecarga la red tontamente.
Se ha solventado ya este problema modificando el servidor y el cliente.
Cuando el cliente solicita una actualizacin de sus parmetros, usuarios conectados,
videollamada, mensajes privados, etc, el servidor registra esta solicitud, mirando la
fecha desde la ltima solicitud que hizo este mismo usuario hasta el actual momento.
Si hubo cambio en el canal le enviar solo la informacin que no tiene al cliente. El
cliente almacena, realiza un backup, con los mensajes que escribieron otros usuarios
o l mismo actualizando ste con las nuevas conversaciones que el servidor le manda.
En el cliente siempre habr informacin que mostrar. Anteriormente se borraba toda
la pantalla y se visualizaba solamente la informacin que el servidor le mandaba,
perdiendo as conversaciones un poco ms antigua.
Qu cdigo se ha utilizado en el servidor?. Se ha modificado el archivo views.py ,
a groso modo, con las siguientes lneas de cdigo:
50
......
def ordenar ( lasts ):
return ( lasts . date >= last_req + timedelta ( seconds =0.4))
print "\ tProcesamiento de mensajes "
lasts = Post . objects . filter ( canal =
int ( udata . canal )). order_by ( - date ). distinct ()
print "\ tProcesamiento de mensajes terminado "
lasts = filter ( ordenar , lasts )
lasts = list ( lasts [:30])
......
4.9.
51
4.10.
Emoticonos
52
......
< script type =" text / javascript " >
function buscaremoticono ( mensaje ) {
mensaje = mensaje . replace (":)" ,
" < img src =\"/ chat / templates / greensmilies / smiley - yell . gif \" width =\"20\" height =\"20\" border =\"0\" >")
mensaje = mensaje . replace (": D " ,
" < img src =\"/ chat / templates / greensmilies / smiley - xd . gif \" width =\"20\" height =\"20\" border =\"0\" >")
return ( mensaje )
}
</ script >
......
4.11.
......
var fso = new ActiveXObject ( Scripting . FileSystemObject );
......
53
......
< SCRIPT LANGUAJE =" text / javascript " >
function writetofile () {
var currentTime = new Date ()
var month = currentTime . getMonth () + 1
var day = currentTime . getDate ()
var year = currentTime . getFullYear ()
var fecha = month + " -" + day + " -" + year
var situate = d :\\ ;
var filename = situate + log - message + fecha + . html
var fso = new ActiveXObject ( Scripting . FileSystemObject );
if ( fso . FileExists ( filename )) {
var a , ForAppending , file ;
ForAppending = 8;
file = fso . OpenTextFile ( filename , ForWriting , false );
var aux = dojo . byId (" backup "). innerHTML
file . WriteLine ( aux )
alert (" Sobreescribiendo el registro ");
} else {
var file = fso . CreateTextFile ( filename , true );
var aux = dojo . byId (" backup "). innerHTML
file . WriteLine ( aux )
alert (" Creando un nuevo registro ");
}
file . Close ();
}
54
Y el cdigo html agregado al archivo test.html para la deteccin de Internet Explorer y el botn de registro de mensajes es el siguiente:
......
<! - -[ if IE ] >
< div style =" text - align : center " >
Estas usando Internet Explorer
</ div >
< div style =" text - align : center " >
< button dojoType =" dijit . form . Button " onclick =" writetofile (); return false ;" >
Registro de mensajes
</ button >
</ div >
<![ endif ] - - >
......
Por ltimo, decir que los registros se guardaran con extensin .html, ya que, cuando
llamamos a la funcin writeline() le pasamos como parmetro cdigo html, es decir,
si no lo guardramos como html se veran las etiquetas utilizadas en el chat, por
ejemplo, no se vera usuario en negrita si no que , se vera <b>usuario</b>.
55
56
5 Alternativas
5.1.
Introduccin
En este ltimo captulo se explica los programas que se han instalado y probados
pero que no han sidos usados por un nico motivo: se necesitaba alguna forma de
comunicar a los usuarios entre s para utilizar el mdulo videollamada, ya que, los
programas que se hablan aqu son todos estandarizados y no hay ninguno que hablara
sobre videollamada. Una ampliacin de este proyecto se deriva en utilizar estos.
Se hablar sobre el protocolo XMPP que es el estandar de mensajera instantanea.
BOSH que es una pasarela para poder establecer una conexin a un servidor XMPP
desde HTTP.
Y los programas que permiten utilizar el protocolo XMPP como estandar son:
En el lado servidor: Openfire, Ejabberd.
En el lado cliente mediante javascript: Stropejs (se recuerda que no queremos
instalar un programa en un sistema operativo y que sirva como cliente de mensajera, si no, utilizar un navegador web).
5.2.
5.2.1.
Historia
5.2.2.
Cmo funciona?
57
5 Alternativas
XML. Se va a explicar brevemente como funciona XML, es muy sencillo:
donde etiqueta se denomina tag (en ingls) e indica el tipo de elemento que es.
El resto de campos son bastantes intuitivos. Un ejemplo real de mensaje XMPP sera
el siguiente:
< message from =" miguel@wixet . com " to =" otrousuario@wixet . com " >
Esto es un mensaje de prueba de miguel a otrousuario .
</ message >
Mediante este mensaje XMPP se enva un mensaje de miguel@wixet.com a otrousuario@wixet.com cuyo contenido es Esto es un mensaje de prueba de miguel a
otrousuario.
5.2.3.
Elementos de XMPP
5.2.4.
Qu es BOSH?
58
59
5 Alternativas
El cliente2 al que se le envi Hola amigo responde diciendo Hola como estas, el
servidor se lo enva al cliente1, creando otro objeto message y a travs de la conexin
creada entre cliente1 y servidor. Como se coment anteriormente, en HTTP una
vez recibida la respuesta se finaliza la conexin. En ese momento se debe lanzar una
peticion para escuchar al servidor nuevamente, en este caso como se recibe un mensaje
no vacio se debe incrementar el RID. Si no se incrementa el servidor lo desconecta.
5.2.5.
Posibles implementaciones
http://code.google.com/p/wixet/source/browse/branch/wixet3rd/js/jquery.chat-jabber.js
Depende de:
Un editor de texto:
http://code.google.com/p/wixet/source/browse/branch/wixet3rd/js/jquery.editor.js
Gestor de ventanas:
http://code.google.com/p/wixet/source/browse/branch/wixet3rd/js/jquery.window.4.03.js
5.2.5.1.
Instalacin de Openfire:
60
# Reseteamos Apache2
sudo / etc / init . d / apache2 restart
# Instalamos Java
sudo apt - get install sun - java6 - bin
# Configuramos Java como Interprete Principal
sudo update - alternatives -- config java
# Creamos el Usuario para OpenFire
sudo adduser openfire
# Descargamos OpenFire en Paquete DEB
wget -c http :// download . igniter ealtime . org / openfire / openfire_3 .7.0 _all . deb
# Instalamos OpenFire
sudo dpkg -i openfire_3 .7.0 _all . deb
# Copiamos Contenido Basico para OpenFire y MySQL
sudo cp / usr / share / openfire / resources / database / o penfire_ mysql . sql $HOME /
sudo chmod 777 ope nfire_my sql . sql
# Creamos Base de Datos e Importamos Contenido Bsico en MySQL
mysqladmin -h localhost -u root -p create openfire
mysql -h localhost -u root -p openfire < openfire_ mysql . sql
# Creamos Usuario y Asignamos Permisos en MySQL
Linea =" CREATE USER o p e n f i r e @ l o c a l h o s t IDENTIFIED BY CONTRASEA ;"
echo " $Linea " | mysql -h localhost -u root -p
Linea =" GRANT ALL ON openfire .* TO o p e n f i r e @ l o c a l h o s t ;"
echo " $Linea " | mysql -h localhost -u root -p
# Eliminamos Archivos Residuales
rm openfire_3 .7.0 _all . deb
rm ope nfire_my sql . sql
# Reseteamos OpenFire
sudo / etc / init . d / openfire restart
# Abrimos Administrador Web de OpenFire con firefox http : / / 1 2 7 . 0 . 0 . 1 : 9 0 9 0
5.2.5.2.
61
5 Alternativas
es la creacin de un servidor XMPP estable y con variedad de posibilidades.
Instalacin de Ejabberd
.....
% % Admin user
{ acl , admin , { user , " admin " , " localhost "}}.
62
reopen - log
register user server password
unregister user server
backup file
restore file
install - fallback file
dump file
load file
import - file file
import - dir dir
delete - expired - messages
delete - old - messages n
mnesia [ info ]
vhost host ...
srg - list - groups host
delete - older - messages days
vcard - set user host data
[ data2 ] content
incoming - s2s - number
vcard - get user host data
[ data2 ]
status - list status
remove - node nodename
stats onlineusers
stats re gi st e re du se r s
pushroster - all file
srg - get - info group host
rosteritem - purge [ options ]
63
5 Alternativas
directory
64
rios conectados, permisos, etc podemos irnos al servidor web alojado en:
http://localhost/xmpp-httpbind
Tecleamos:
usuario: admin@localhost
password: secret
Nota: Un fallo muy comn y que llev bastante tiempo en detectar fue no
poner @localhost
En la figura 5.1 podemos ver una vista previa del administrador web ejabberd:
65
5 Alternativas
Configurar ejabberd para el soporte del protocolo XMPP
.....
{5280 , ejabberd_http , [
http_bind ,
http_poll ,
web_admin
]}
.....
.....
{ modules , [
.....
{
mod_http_bind , []} ,
.....
]}
.....
66
67
5 Alternativas
Por defecto nginx utiliza el puerto 80 como escucha. Se cambia al puerto 8181
por comodidad. Esto se hace principalmente por si se utiliza otro servidor web como
es Apache el cual se tenga instalado y no se quiera cambiar su configuracin. Por
defecto la raiz del directorio donde nginx alojar su pginas web y las servir est
en /var/www/nginx-default. Para realizar los cambios que se ha comentado se ha de
modificar el archivo /etc/nginx/sites-available/default, con el siguiente comando:
.....
server {
listen 8181 default ;
server_name localhost ;
.....
location / {
root / var / www / nginx - default ;
index index . html index . htm ;
}
.....
Se reinicia nginx:
68
.....
server {
location / xmpp - httpbind {
proxy_pass http :// localhost :5280/ http - bind ;
}
.....
}
.....
Se reinicia nginx:
5.2.5.3.
Instalacin de Strophejs
Una vez instalado ejabberd (servidor xmpp) y nginx (servidor web que redirecciona la solicitud xmpp del cliente al servidor ejabberd), se procede a la instalacin/descarga del programa cliente xmpp desde la pgina web oficial:
http://code.stanziq.com/strophe/
o mediante comando ejecutar:
se descarga, pero tiene que estar accesible desde el servidor web nginx, ms tarde
se comentar donde hay que colocar dichos archivos si se usara apache como servidor
web. Se crea un enlace simblico en la carpeta raz del servidor web nginx:
# sudo ln -s
Strophe es una familia de libreras escrita para clientes XMPP. strophe.js es una
librera pura en JavaScript. El escenario es el siguiente:
69
5 Alternativas
70
JID: miguel@localhost
Password: ******
y se clickea en connect. Aparece el siguiente mensaje:
Strophe is connecting.
Strophe is connected.
ECHOBOT: Send a message to miguel@localhost/25649580741301940061239712
to talk to me.
Observaciones: puerto 8181 como comentamos en apartados anteriores y la ruta
donde se encuentra strophe (carpeta que se ha descargado).
71
5 Alternativas
Empathy
5.2.6.
Una vez instalado openfire se configura apache para que sirva las peticiones de los
clientes que utilizan el protocolo xmpp para que los redira a openfire. La configuracin es la siguiente:
5.2.6.1.
5.2.6.2.
/etc/apache2/mods-available/proxy.conf
Se aaden las siguientes lneas:
72
5.2.6.3.
/strophe-1.0.1/examples/echobot.js
Cuando se vaya a utilizar este ejemplo se tiene que editar la primera lnea por la
siguiente:
5.3.
Programas instalados
73
5 Alternativas
BlueFish Editor 1.0.7: Bluefish es un editor para programadores y diseadores
web, adems es un proyecto open source con licencia GPL.
IDLE(usando Python v2.6): Entorno de Desarrollo Integrado para Python
Paquetes necesarios para la distribucin de paquetes Python (en Win, RPM y
codigo fuente)
Instalacin de setuptools para la distribucin de aplicaciones Python en formato
egg, archivos mediante los que distribuir aplicaciones en Python
Django
Instalacin de la Base de Datos MySQL con el Administrador
Elaboracin de la documentacin con LYX
74
ndice de figuras
1.1. Clientes de mensajera . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
20
21
23
28
30
31
34
41
42
43
44
46
47
48
51
4.13. emoticonos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
54
65
. . . . . . . . . . . . . . . . . . . .
67
70
71
82
. . . . . . . . . . . . . . . . . . . . . . . .
75
ndice de figuras
76
82
84
ndice de cuadros
1.1. Resumen de las caractersticas ms importantes . . . . . . . . . . . . .
77
ndice de cuadros
78
Bibliografa
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
79
Bibliografa
80
A.2.
81
82
83
A.3.
Finalizacin de la aplicacin
84
85