2016-04-02 6 views
2

Ich versuche, ein einfaches Twisted-Problem zu lösen.Twisted Senden von Daten an alle Clients von außerhalb der Factory-Sitzungen mit Aufgabe Looping Call

Ich verwende das Python 2.7 Twisted Chat.py Beispiel für die Einfachheit.

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor 

class Chat(LineReceiver): 

    def __init__(self, users): 
     self.users = users 
     self.name = None 
     self.state = "GETNAME" 

    def connectionMade(self): 
     self.sendLine("What's your name?") 

    def connectionLost(self, reason): 
     if self.users.has_key(self.name): 
      del self.users[self.name] 

    def lineReceived(self, line): 
     if self.state == "GETNAME": 
      self.handle_GETNAME(line) 
     else: 
      self.handle_CHAT(line) 

    def handle_GETNAME(self, name): 
     if self.users.has_key(name): 
      self.sendLine("Name taken, please choose another.") 
      return 
     self.sendLine("Welcome, %s!" % (name,)) 
     self.name = name 
     self.users[name] = self 
     self.state = "CHAT" 

    def handle_CHAT(self, message): 
     message = "<%s> %s" % (self.name, message) 
     for name, protocol in self.users.iteritems(): 
      if protocol != self: 
       protocol.sendLine(message) 


class ChatFactory(Factory): 

    def __init__(self): 
     self.users = {} # maps user names to Chat instances 

    def buildProtocol(self, addr): 
     return Chat(self.users) 


reactor.listenTCP(8123, ChatFactory()) 
reactor.run() 

Was ich versuche twisted.internet Aufgabe zu tun ist, zu verwenden, um eine Aufgabe zu erstellen, die alle 60 Sekunden und sendet die Daten an alle angeschlossenen Sitzungen ausgeführt wird.

halbPseudoCode

def broadcastmsg(): 
    for client in factory: 
     client.protocol.transport.write("I am a Test\n\r") 

event = task.LoopingCall(broadcastmsg) 
event.start(60) 

Das Problem ist, ich nicht verdrehen kann, richtig zu verhalten. Ich kann es pro Sitzung schaffen. Aber dann für jede Verwendung, die es verbindet Spams doppelt so viel usw.

Antwort

0

Wie richten Sie Looping-Anruf ein?

Wie Sie wissen, werden Protokolle von Fabriken erstellt und verwaltet. Das regelmäßige Senden einer Nachricht an alle Benutzer sieht wie eine Aufgabe aus, die in die Factory eingefügt werden sollte. Sie können loopingCall in der Factory-Methode __init__ erstellen und direkt nach der Initialisierung starten. Da Sie eine Fabrik pro alle Verbindungen haben sollte

class ChatFactory(Factory): 

    def __init__(self): 
     self.users = {} # maps user names to Chat instances 

     def broadcast_msg(): 
      for name in self.users: 
       self.users[name].sendLine("looping call send to users: {}".format(self.users.keys())) 

     self.looping_call = task.LoopingCall(broadcast_msg) 
     self.looping_call.start(60) 

pro 60 Sekunden nur einmal Benachrichtigungen senden sollte ok arbeiten, zumindest ist es für mich tut.

+0

Ich tat das, aber wenn ich "Fehler" in broadcast_msg auslösen, erscheint die Ablaufverfolgung nicht, selbst wenn ich den Code '' 'd = self.looping_call.start (60) addiere; d.addErrback (twisted.python.log.err) '' 'Kannst du damit helfen? – rolele

Verwandte Themen