我在试着解决一个简单的扭曲问题。
为了简单起见,我使用Python2.7扭曲的Chat.py示例。
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()我要做的是使用twisted.internet任务创建一个任务,该任务每60秒运行一次,并向所有连接的会话发送数据。
半伪码
def broadcastmsg():
for client in factory:
client.protocol.transport.write("I am a Test\n\r")
event = task.LoopingCall(broadcastmsg)
event.start(60) 问题是,我不能让扭曲的行为正确。我可以让它在每次会议的基础上实现。但是对于连接它的每一种用途,垃圾邮件的数量都是原来的两倍,等等。
发布于 2016-04-03 15:51:20
你是如何设置循环电话的?
如您所知,协议由工厂创建和管理。定期向所有用户发送一些消息似乎是一项应该投入工厂的任务。您可以在工厂loopingCall方法中创建__init__,并在init之后立即启动它。由于每个连接都有一个工厂,因此应该每60秒只发送一次通知。
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)这应该没问题,至少对我来说是这样。
https://stackoverflow.com/questions/36368842
复制相似问题