Diferència entre revisions de la pàgina «Xat amb ZEO»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
(Es crea la pàgina amb «Cal elaborar un programa de xat utilitzant el servidor ZODB per xarxa, és a dir, el ZEO: Consultar: * ZODB == Especificacions de l'exercici == Especificacions: * …».)
 
 
(Hi ha 6 revisions intermèdies del mateix usuari que no es mostren)
Línia 13: Línia 13:
 
* Per defecte podeu utilitzar el canal "test". Després ho sofisticarem una mica més.
 
* 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.
 
* 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.
  
  
Recomanacions:
+
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.
+
* 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.
 
* 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.
 +
 +
<br>
  
 
== Classe Missatge ==
 
== Classe Missatge ==
Per tal que l'aplicació sigui compatible convé que tots tinguem la mateixa 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:
 +
<syntaxhighlight lang="python">
 +
from missatge import Missatge
 +
</syntaxhighlight>
 +
 +
L'arxiu "missatge.py":
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
 
# -*- coding: utf-8 -*-
 
# -*- coding: utf-8 -*-
Línia 37: Línia 49:
 
         self.text = miss
 
         self.text = miss
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
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. [http://www.zodb.org/documentation/guide/zeo.html#zeo-programming-notes 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
 +
 +
<br>

Revisió de 10:45, 14 maig 2013

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

Consultar:


Especificacions de l'exercici[modifica]

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[modifica]

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[modifica]

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