2010-09-16 8 views
2

Je veux utiliser Twisted pour reconstruire la partie communication d'une application existante. Cette application envoie des données du client au serveur, seulement de cette façon, le serveur n'envoie rien.Envoyer à partir du client Twisted vers le serveur Twisted, seulement cette manière

Comment réaliser ceci avec le concept de Twisted? J'utilise actuellement la méthode connectionMade de Protocol, mais je ne pense pas que ce soit la bonne façon.

class Send(Protocol): 

    def connectionMade(self): 
     while True: 
      data = queue.get() 
      self.transport.write(data + "\n") 
      self.transport.doWrite() 

Je suis assez sûr, cela est pas la façon de le faire. ;-)

Addition: Mon problème est, je ne peux pas l'imagerie quel événement à utiliser pour cela. Je pense que l'événement connectionMade n'est pas le bon, mais je n'atteindrai jamais un autre événement que connectionLost dans mon cas, car le serveur n'envoie rien au client. Devrais-je changer ce comportement?

Répondre

2

Non, c'est certainement pas la bonne façon de le faire. Jamais, jamais appeler doWrite.

Le problème ici est que je parie queue.get() juste des blocs jusqu'à ce qu'il y ait quelques données. Si possible, utilisez un moyen de blocage des messages non bloquant plutôt que des threads. Par exemple, ayez votre fil juste callFromThread à votre protocole Send pour faire quelque chose.

Mais, en supposant un blocage 'get' appeler, quelque chose comme cela pourrait fonctionner:

from twisted.internet.protocol import Protocol 
from twisted.internet.threads import deferToThread 

class Send(Protocol): 
    def connectionMade(self): 
     self.qget() 

    def qget(self, data=None): 
     if data is not None: 
      self.transport.write(data) 
     deferToThread(queue.get).addCallback(self.qget) 
+2

http://stackoverflow.com/questions/1538617/http-download-very-big-file/1657324# 1657324 parle des dangers des boucles dans le code Twisted, et couvre également les producteurs/consommateurs qui pourraient également être utiles au questionneur. –

+0

Oui, il semble raisonnable de ne pas utiliser de boucles ni de bloquer les appels dans les événements Twisted, cela rendrait le cadre événementiel insensé. –

+0

pourquoi ne devriez-vous jamais appeler 'doWrite'? – Claudiu