【问题标题】:How to init twisted reactor in the right way?如何以正确的方式启动扭曲反应器?
【发布时间】:2011-01-16 22:58:58
【问题描述】:

我有一个 MyJabber 类,它初始化一个打印的基本 jabber 帐户 传入的消息到标准输出 + 将它们放入队列中。

将客户端添加到反应器的代码是这样的:

def addReactor(self):
    print 'inside  AddReactor'
    factory = client.basicClientFactory(self.jid, self.option['jabber']['password'])
    print "factory initialized"
    factory.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, self.authd)
    print 'factory bootsraped'
    reactor.connectTCP(self.option['jabber']['server'], 5222, factory)

它是这样调用的:

jabber = MyJabber(options, to_irc)
jabber.addReactor()
reactor.run()

当我启动应用程序时,我看到了 addReactor 的“打印”,但之后就什么也没有了。 我通过“tcpdump”看到有东西试图连接到“jabber.org”,但与 authd def 无关:

def authd(self, xmlstream):
    global thexmlstream
    thexmlstream = xmlstream
    # need to send presence so clients know we're
    # actually online.
    print 'Initializing...'
    presence = domish.Element(('jabber:client', 'presence'))
    presence.addElement('status').addContent('Online')

    xmlstream.send(presence)
    # add a callback for the messages
    print 'Add gotMessaged callback'
    xmlstream.addObserver('/message', gotMessage)
    print 'Add * callback'
    xmlstream.addObserver('/*', gotSomething)

【问题讨论】:

    标签: python twisted xmpp twisted.words


    【解决方案1】:

    这似乎并不是关于如何“启动扭曲反应器”的问题。相反,它似乎更多地是关于如何使用 Twisted Words 的 XMPP 支持来发送和响应 XMPP 消息。

    您可以在 Twisted Words 示例目录中找到几个示例:

    http://twistedmatrix.com/documents/current/words/examples/

    试试xmpp_client.pyjabber_client.py

    【讨论】:

    • 注意边:如果我更改类定义,并且我将代码用作单个应用程序,它工作正常。反应堆代码没有问题。正如我所理解的,反应堆组件也可以在类定义之外激活,因为它是所有协议共享的组件。但它挂起。所以问题的重点是反应堆相关的:) xmpp 代码工作正常:)
    • “类定义之外”或(隐含的)“类定义内”之间没有根本区别。如果采用一种方法的代码版本有效,而采用不同方法的版本无效,那么在从一种方法转换到另一种方法时,您已经引入了一些错误。但是,仅通过阅读您在此处发布的代码是无法知道什么错误的。
    【解决方案2】:

    已修复,有 2 个错误。

    1) 我不小心忘记了 JID 是 name@domain.tld/extra

    2) 忘记将self. 添加到gotMessage/gotSomething

    我还让 addReactor 返回工厂,并在 main() 中写道:

    jabber = MyJabber(options, to_irc)
    factory = jabber.addReactor()
    reactor.connectTCP(options['jabber']['server'], 5222, factory)
    reactor.run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2018-03-02
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多