http://cooldesigner.javaeye.com/blog/51200
关键字: Twisted Python Network
Twisted 是用Python编写的开源的 framework,它基于事件-驱动模式,高效、简洁的实现了非阻塞方式的网络编程。在Twisted中有个event loop,被称为事件管理,当其运行时,它就开始侦听各种事件的发生,并启动事件的响应函数。Twisted默认对事件不做任何处理,如果你添加了某个事件的处理函数,那就遵循你的处理过程了,是不是很简单。
在Twisted中的event loop,就是reactor对象了,reactor对象处理许多重要的任务:如: scheduling, threading, 建立网络连接,侦听客户端的连接等等, 如果想要reactor处理上述事件,则只要运行reactor.run()即可。
例如:下面的一个例子
from twisted.internet import reactor #导入reactor模块
print "Runing the reactor..."
reactor.run() #运行reactor,进入Twisted的事件循环管理
print "reactor stopped."
上面的代码什么也不做,因为我们没有添加任何的事件处理函数,如果不调用reactor.stop(),则程序一直处于接受事件的过程中,或者键入Ctrl-C组合键来强制关闭程序。下面再写个例子,该例子调用reactor.callLater()函数,这个函数的作用是告诉reactor我要在将来某个时间里,执行哪些工作,类似于计划任务。该函数有两个参数,第一个参数为要等待的秒数,第二个是要运行的函数名称,如果该函数有参数,则可以填写传递的参数:如:reactor.callLater(10,func,True,x=2) ,func为函数名称,True和x=2为func函数的参数。
from twisted.internet import reactor
import time
def printTime():
print "Current tim is",time.strftime("%H:%M:%S")
def stopReactor():
print "stopping reactor"
reactor.stop()
reactor.callLater(1,printTime) #1秒后执行printTime函数
reactor.callLater(10,printTime) #10秒后再执行printTime函数
reactor.callLater(15,stopReactor) #15秒后执行stopReactor函数,在退出event loop。
print "Running the reactor..."
reactor.run()
print "Rector stopped."
所有的网络通讯,必须建立在两台计算机建立连接通道的情况下,进行数据传输,那么在Twisted中如何建立呢?其实Twisted都已经封装了网络通讯的底层协议,我们只要调用reactor.connectTCP()方法即可,该方法有3个参数,第一个是需要连接的主机,第二个是端口号,第三个是一个ClientFactory 对象,该ClientFactory对象负责建立网络连接后的工作,看下面的例子:
from twisted.internet import reactor,protocol
class QuickDisconnectProtocol(protocol.Protocol):
def connectionMade(self): #---重载了Protocol的connectionMade()方法,该事件在连接成功后出现
print 'Connected to %s.' % self.transport.getPeer().host
self.transport.loseConnection() #---
class BasicClientFactory(protocol.ClientFactory):
protocol=QuickDisconnectProtocol # --设置protocol属性为自定义的QuickDisconnectProtocol
def clientConnectionLost(self,connector,reason): #--重载了clientConnectionLost方法,该事件在已经建立的通道端口或关闭的情况下触发。
print 'Lost connection:%s' % reason.getErrorMessage()
reactor.stop()
def clientConnectionFailed(self,connector,reason): #--也是重载了clientConnectionFailed方法,该事件在无法建立通道的情况下触发。
print 'Connection failed:%s' % reason.getErrorMessage()
reactor.stop()
reactor.connectTCP('www.comeinfo.com',80,BasicClientFactory())
reactor.run()
上面定义了两个类,分别继承自ClientFactory 和 Protocol类,这两个类处理连接中所有可能发生的事件:成功建立连接、连接失败、连接断开、数据传送等等。ClientFactory类负责管理连接通道的各种事件,一旦通道建立成功,则ClientFactory就会自动创建一个Protocol对象来处理每一个成功的连接,该Protocol对象就可以在该通道上进行数据传输等各种工作,如数据的接受、发送,是否关闭连接等。
twisted中定义了多个事件的原型,在程序中只要重载需要的方法,即可完成事件-驱动模式的编写,编写起来和delphi以及其他RAD 一样。