免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2021 | 回复: 0
打印 上一主题 下一主题

http://cooldesigner.javaeye.com/blog/51200 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-24 20:25 |只看该作者 |倒序浏览
关键字: 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 一样。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23783/showart_704769.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP