在绞合上调用connectTCP方法后调用sendLine()方法

时间:2014-06-16 08:49:23

标签: python client-server twisted

我制作了一个使用LineReceiver的简单服务器。我用Telnet测试时可以设法发送和接收消息。

我想更进一步,并使用一个小的GUI来发送和接收消息。

我想象的方式是我会以某种方式使用某种连接函数调用reactor.run()方法,并创建ClientFactory类的实例。我基于这个例子,我发现:

#!/usr/bin/env python

# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.


from twisted.internet.protocol import ClientFactory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
import sys

class EchoClient(LineReceiver):
    end="Bye-bye!"
    def connectionMade(self):
        self.sendLine("Hello, world!")
        self.sendLine("What a fine day it is.")
        self.sendLine(self.end)

    def lineReceived(self, line):
        print "receive:", line
        if line==self.end:
            self.transport.loseConnection()

    def sendMessage(self, line):
        self.sendLine(line)

class EchoClientFactory(ClientFactory):
    protocol = EchoClient

    def clientConnectionFailed(self, connector, reason):
        print 'connection failed:', reason.getErrorMessage()
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print 'connection lost:', reason.getErrorMessage()
        reactor.stop()

def main():
    factory = EchoClientFactory()
    reactor.connectTCP('localhost', 1234, factory)
    reactor.run()

if __name__ == '__main__':
    main()

观察当我调用main()函数时,connectionMade将发送这些消息。

如何运行reactor和factory,并调用sendLine函数?

1 个答案:

答案 0 :(得分:1)

如果反应堆正在运行,扭曲的呼叫会被分解为对未来行动和立即(或接近立即行动)的行为进行排队的事情。您可以将这些结合起来安排将来发生的事情。 (见:Scheduling tasks for the future

因此,如果您希望将来调用sendLine,可以使用reactor.callLater(5, sendLine, arg_to_sendLine)。这将安排sendLine调用在callLater调用后5秒运行(...假设您的代码处于reactor.run()状态)

你也说过:

  

我想象的方式是我会以某种方式使用某种调用reactor.run()方法的连接函数

这句话让我担心,因为Twisted是一个包罗万象的框架(在大多数扭曲的程序reactor.run()中,它的设置调用成为整个main),而不仅仅是你开始的时候你想做通信(当你尝试并且只在中途使用它时反应很差。)