Twisted是一个码量很大的一个框架,不够轻盈。
学习Twisted或者说学习怎么使用Twisted,必须知道reactor,protocol,factoroy的含义。
- reactor是管理twisted框架的核心。所有的事件都会触发reactor,然后他会开启服务,初始化factory,factory再初始化protocol。常用的有run()、stop()、callLater。如下最简单的程序:
from twisted.internet import reactor
def hello():
print('test')
if __name__=='__main__':
reactor.callWhenRunning(hello)
reactor.run()
reactor会一直执行,callWhenRunning意味着将hello函数注册了,当运行时回调。开始运行时执行hello,然后继续循环等待事件发生。
- factory 在twisted框架中负责连接,通信时建立连接,以及连接中断的处理。如下最简单的客户端的例子:
from twisted.internet import reactor,protocol
class TestProtocol(protocol.Protocol):
def connectionMade(self):
print('连接完成后会自动调用')
class TestFactory(protocol.ClientFactory):
protocol=TestProtocol
def clientConnectionFailed(self,connector,reason):
print('连接失败后调用')
reactor.stop()
def clientConnectionLost(self,connector,reason):
print('失去连接后调用')
reactor.stop()
if __name__=='__main__':
reactor.connectTCP('localhost',51234,TestFactory())
reactor.run()
当调用connectTCP的时候初始化TestFactory,没有实际得开始连接,当执行run()的时候开始连接,连接完成会自动调用connectionMade,没有连接上(比如端口没开放)会调用连接失败函数,丢失连接会自动调用丢失函数。所以说factory主要控制连接,初始化协议(执行会话所需的协议)。
- Protocol负责会话,数据的传输。比如我们可以重载datarecv、lineRec eived等函数,就可以在收到信息的时候处理。如下程序,是简单服务器重载lineReceived:
from twisted.internet import reactor,protocol
from twisted.protocols import basic
class Echo(basic.LineReceiver):
def lineReceived(self,line):
if line=='quit':
print('退出')
self.sendLine('baibai')
self.transport.loseConnection()
else:
print('返回信息')
self.sendLine('You said: '+line)
class EchoFactory(protocol.ServerFactory):
protocol=Echo
if __name__=="__main__":
port=5001
reactor.listenTCP(port,EchoFactory())
reactor.run()
运行后,接收到端口来的信息后line后处理,这是最简单的echo服务器。
这个程序在本机上出了点问题,没运行出来。
reactor回调模型
下面是这几天学习Twisted的一些资源:
https://blog.csdn.net/bluehawksky/article/details/79814577有关于回调的一些图解
http://blog.sina.com.cn/s/blog_704b6af70100py9n.html twisted书籍章节,基于github的一个诗歌项目
https://www.cnblogs.com/zhangjing0502/archive/2012/05/17/2506687.html
对protrocl,factory,reactor的讲解非常详细
http://blog.sina.com.cn/s/blog_704b6af70100py9n.html六十多页百度文库最详细的讲解,由浅入深