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.
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