好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Twisted网络编程必备.docx

32页
  • 卖家[上传人]:新**
  • 文档编号:532366139
  • 上传时间:2024-02-29
  • 文档格式:DOCX
  • 文档大小:83.43KB
  • / 32 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Twisted网络编程必备(1)注:测试版本Twisted-10.1.0.winxp32-py2.6转自: 如果你并不准备使用Twisted,你可能有很多异议为什么使用Twisted而不是其他网络函数库或框架?如下是一些充分的理由:·基于PythonTwisted是使用Python编写的,强壮的、面向对象的解释性语言Python使它的爱好者充满热情使用Python编程是一种乐趣,易于编写、易于阅读、易于运行因为Python是跨平台的,所以可以运行Twisted程序在Linux、Windows、Unix和MAC等等系统上·异步和事件驱动的同步网络编程函数库留给开发者一个痛苦的抉择:要么允许程序在网络通信时失去响应,或者引入非常复杂的线程Twisted是基于事件的,异步网络通信框架允许编写的程序在处理事件时保持相应,却不需要使用线程·多功能Twisted包括大量的功能Email、WEB、news、chat、DNS、SSH、Telnet、RPC、数据库存取或者更多所有的都为你准备好了·灵活Twisted提供了高层类允许快速开始而且并没有感到受限如果需要高级功能,或者需要自定义网络协议,也是可以的。

      你可以实现自己的网络协议,控制每一个字节·开放源代码Twisted是免费的它包含源代码,按照函数库协议发行并且欢迎在你的程序中使用Twisted,不必支付任何费用和担心法律问题如果希望知道一个对象的运行原理也可以直接看源码如果你开发出了自己的新功能和扩展,欢迎与我们共享·社区支持Twisted有一个活跃的社区包含开发者和用户如果你发现了问题,也可以在邮件列表上找到很多开发者来帮助你查看第一章的寻找FAQ一节或者进入#twisted这个IRC频道,来与开发者进行交流·易于整合的平台一个Twisted程序可以在多种服务之间共享数据,可以整合很多工作比如可以编写SMTP到XMLRPC的代理,一个通过SSH来更新网站的服务,或者一个包含NNTP接口的WEB讨论组如果需要在平台之间交换数据,Twisted是个很好的选择 启动Twisted的事件循环Twisted是事件驱动的框架这意味着不再使用特定序列来处理程序逻辑,而是通过被动调用一些函数来实现例如,GUI程序里面使用的"button pressed"事件设计者不需要事先确定事件何时发生,只需要编写事件的响应函数即可这就是所谓的事件处理器(event handler)。

       每个事件驱动的框架都包含了一个特殊的函数叫做事件循环(event loop)每次启动,事件循环都会立即运行这个函数运行时等待事件的发生当事件发生时,事件循环函数会自动触发相关的事件处理函数使用事件循环需要改变一些顺序编程的习惯一旦开始了事件循环,你将无法控制程序的执行顺序,只会自动响应事件所以,你需要为程序设计事件处理器也就是事件发生时的响应在Twisted中,有一种特殊的对象用于实现事件循环这个对象叫做reactor可以把反应器(reactor)想象为Twisted程序的中枢神经除了分发事件循环之外,反应器还做很多重要的工作:定时任务、线程、建立网络连接、监听连接为了让反应器可以正常工作,需要启动事件循环 启动反应器 启动反应器是很简单的,从twisted.internet模块导入reactor对象然后调用reactor.run()来启动反应器的事件循环下例展示了代码:from twisted.internet.selectreactor import SelectReactorprint 'Running the reactor ...'reactor = SelectReactor()reactor.run()print 'Reactor stopped.' 反应器将会一直运行,直到接到停止的通知,可以按下Ctrl+C来退出事件循环,并终止程序:$ python runreactor.pyRunning the reactor ...^CReactor stopped. 这是一个简洁的例子。

      尽管反应器运行着,但是没有做任何事情下面的例子提供了更多有趣的事情,介绍了反应器的callLater方法reactor.callLater方法用于设置定时事件这个方法在用于定时在未来执行比如一个函数已经是一个事件处理器了,这种事件会在一定时间之后启动下面的例子,函数调用了一定时间之后被调用: 代码from twisted.internet.selectreactor import SelectReactorimport timereactor = SelectReactor()def printTime(): print 'Current time is',time.strftime("%H:%M:%S")def stopReactor(): print "Stopping reactor" reactor.stop()reactor.callLater(1,printTime)reactor.callLater(2,printTime)reactor.callLater(3,printTime)reactor.callLater(4,printTime)reactor.callLater(5,stopReactor)print 'Running the reactor ...'reactor.run()print 'Reactor stopped.' 运行这个程序,可以看到如下结果:$ python calllater.pyRunning the reactor ...Current time is 10:33:44Current time is 10:33:45Current time is 10:33:46Current time is 10:33:47Stopping reactorReactor stopped. 它是如何工作的 第一个例子简介了导入与执行reactor.run()来启动事件循环。

      反应器将会一直保持执行直到按下Ctrl-C,尽管这一段时间什么都不做在这时,反应器停止了,程序执行到代码的最后一行,并打印出反应器已经停止的消息第二个例子使用reactor.callLater函数定时执行函数reactor.callLater函数包含两个必须参数,等待的秒数,和需要调用的函数在设置了定时函数调用之后,控制就回到了反应器的事件循环reactor.run()中了Tip:你可以传递附加的参数和键值对到reactor.callLater中,这些用于调用指定的函数例如,reactor.callLater(1,func,True,x="Hello"),将会最终调用func(True,x="Hello"),在一秒钟之后第一个定时函数是printTime(),简单显示了当前时间第五个定时函数是stopReactor(),其中调用了reactor.stop(),导致了反应器退出了事件循环这也是为什么不需要按下Ctrl-C而自动退出了事件循环的原因Tip:在这种情况下仍然可以按下Ctrl-C来手动停止事件循环注意事件的发生顺序,反应器按照给定的时间来调用指定的函数一旦反应器开始运行,反应器就会控制事件循环,并在指定时间调用函数。

      反应器在被告知停止之前会一直运行,直到reactor.stop()调用一旦反应器停止了,程序将继续处理最后一行,显示反应器停止的消息Tip:在实际应用中,reactor.callLater是常用于超时处理和定时事件可以设置函数按照指定的时间间隔来执行关闭非活动连接或者保存内存数据到硬盘 建立(establishing)一个TCP连接 所有的网络应用程序都必须做一个简单的步骤,开启一个连接接着可以发送邮件、传递文件、看电影等等,但是在所有这些之前,必须在电脑之间建立一个连接本节讲解了如何使用reactor开启TCP连接 调用reactor.connectTCP()方法打开一个TCP连接,传递一个ClientFactory对象作为第三个参数ClientFactory对象等待连接被建立,然后创建一个Protocol对象来管理连接中的数据流下面的例子展示了如何在电脑和Internet之间建立一个连接():from twisted.internet.selectreactor import SelectReactorfrom twisted.internet.protocol import Protocol,ClientFactoryreactor = SelectReactor()protocol = Protocol()class QuickDisconnectedProtocol(Protocol): def connectionMade(self): print "Connected to %s."%self.transport.getPeer().host self.transport.loseConnection()class BasicClientFactory(ClientFactory): protocol=QuickDisconnectedProtocol def clientConnectionLost(self,connector,reason): print 'Lost connection: %s'%reason.getErrorMessage() reactor.stop() def clientConnectionFailed(self,connector,reason): print 'Connection failed: %s'%reason.getErrorMessage() reactor.stop()reactor.connectTCP('',80,BasicClientFactory())reactor.run() 当运行这个例子的时候,可以看到如下输出:$ python connection.pyConnected to 66.249.89.104.Lost connection: Connection was closed cleanly.除非你的电脑没有。

      在这种情况下,会看到如下错误信息:$ python connection.pyConnection failed: DNS lookup failed: address '' not found. 它是如何工作的 这里有两个主要的类用于作为客户端工作,ClientFactory和Protocol这些类被设计成处理连接中所有可能运到的事件:成功建立连接、连接失败、连接断开、数据传送等等ClientFactory和Protocol有严格的不同ClientFactory的工作是管理连接事件,并且创建Protocol对象处理每一个成功的连接一旦连接建立,Protoc。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.