我制作了一个使用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函数?
答案 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
),而不仅仅是你开始的时候你想做通信(当你尝试并且只在中途使用它时反应很差。)