首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用任务循环调用从工厂会话外部向所有客户端发送数据

使用任务循环调用从工厂会话外部向所有客户端发送数据
EN

Stack Overflow用户
提问于 2016-04-02 03:30:01
回答 1查看 815关注 0票数 3

我在试着解决一个简单的扭曲问题。

为了简单起见,我使用Python2.7扭曲的Chat.py示例。

代码语言:javascript
运行
复制
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秒运行一次,并向所有连接的会话发送数据。

半伪码

代码语言:javascript
运行
复制
def broadcastmsg():
    for client in factory:
        client.protocol.transport.write("I am a Test\n\r")

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

问题是,我不能让扭曲的行为正确。我可以让它在每次会议的基础上实现。但是对于连接它的每一种用途,垃圾邮件的数量都是原来的两倍,等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-03 15:51:20

你是如何设置循环电话的?

如您所知,协议由工厂创建和管理。定期向所有用户发送一些消息似乎是一项应该投入工厂的任务。您可以在工厂loopingCall方法中创建__init__,并在init之后立即启动它。由于每个连接都有一个工厂,因此应该每60秒只发送一次通知。

代码语言:javascript
运行
复制
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)

这应该没问题,至少对我来说是这样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36368842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档