Xat amb ZEO

De Cacauet Wiki
Salta a la navegació Salta a la cerca

Cal elaborar un programa de xat utilitzant el servidor ZODB per xarxa, és a dir, el ZEO:

Consultar:


Especificacions de l'exercici

Especificacions:

  • Connectar-se al servidor ZEO de la màquina del professor (us indicarà les dades, host i port, a classe).
  • Accediu a l'element arrel (root) = diccionari.
  • Podeu llistar les keys del diccionari. Cadascuna serà un canal de xat.
  • Cada canal de xat serà una llista de Missatges (veure especificació de la classe més avall).
  • Per defecte podeu utilitzar el canal "test". Després ho sofisticarem una mica més.
  • Cal que cada usuari que es connecta tingui un "nick" i que el demani al connectar.
  • Per sortir cal posar "exit" al prompt del xat.


Anem pas a pas:

  • Inicialment podem fer el programa per consola. Demanem el nick i llistem tots els missatges existents cada cop que aportem alguna cosa.
  • Modifiquem l'aplicació per tal que només ens mostri els darrers missatges enviats des del darrer cop (utilitzant el timestamp o "temps").
  • Afegir un timer per tal que actualitzi la llista de missatges per pantalla si hi ha alguna aportació nova.
  • Fer una petita aplicació amb PyQt i Qt-Designer que faciliti la visualització de la conversa.
  • També ho podeu resoldre amb Pyramid i un servei web.


Classe Missatge

Per tal que l'aplicació sigui compatible hem de compartir la mateixa classe Missatge.

IMPORTANT: crea un arxiu "missatge.py" i posa-hi la següent classe. Per tal que funcioni correctament has d'importar la classe a la teva aplicació amb:

from missatge import Missatge

L'arxiu "missatge.py":

# -*- coding: utf-8 -*-

import datetime

class Missatge(object):
    temps = 0
    nick = ""
    text = ""
    
    def __init__(self,nick,miss):
        self.temps = datetime.datetime.now()
        self.nick = nick
        self.text = miss

ZODB guarda els objectes amb el nom del mòdul d'on s'ha importat. Per tant, cal que importem tots la mateixa classe des del mateix nom d'arxiu (mòdul). Si no ho fem així ens donarà un error com un objecte "broken" perquè no reconeixerà quina classe és (pel nostre cas és la classe "missatge.Missatge").


Problema de concurrència

Es pot donar un problema de concurrència quan 2 usuaris es connecten i actualitzen els missatges independentment.

La solució és sincronitzar la llista de missatges just abans de afegir el nou missatge a aportar. Llegiu aquí per saber més de la sync:

connexio.sync()
conversa = connexio.root()["test"]
# ...i afegim el nou missatge
# ...i li fem un commit