Twisted 框架简介

  • Twisted 框架介绍
  • 创建Twisted Reactor TCP 服务器
  • 创建Twisted Reactor TCP 客户端

Twisted 框架介绍

Twisted 是一个完整的事件驱动的网络框架,利用它既能使用也能开发完整的异步网络应用程序和协议。

它现在还不是标准库的一部分,所以必须单独下载并安装它。使用pip install即可。

它提供了大量的支持来建立完整的系统,包括网络协议、线程、安全性和身份验证、聊天/ IM、 DBM 及RDBMS 数据库集成、 Web/因特网、电子邮件、命令行参数、 GUI 集成工具包等。

Twisted 提供了一个更加强大和灵活的框架,并且已经实现了很多协议。可以在
http://twistedmatrix.com 网站上找到更多关于 Twisted 的消息。

与 SocketServer 类似, Twisted 的大部分功能都存在于它的类中。

创建Twisted Reactor TCP 服务器

示例代码:

from twisted.internet import protocol, reactorfrom time import ctimePORT = 21567class TSServProtocol(protocol.Protocol):def connectionMade(self):clnt = self.clnt = self.transport.getPeer().hostprint('...connected from: {}'.format(clnt))def dataReceived(self, data):print('received from clinet: {}'.format(data.decode('utf-8')))data_formated = '[{}] {}'.format(ctime(), data.decode('utf-8'))self.transport.write(data_formated.encode('utf-8'))factory = protocol.Factory()
factory.protocol = TSServProtocolprint('waiting for connection...')
reactor.listenTCP(PORT, factory)
reactor.run()

获得protocol类并为时间戳服务器调用TSServProtocol。然后重写了connectionMade()和dataReceived()方法,当一个客户端连接到服务器时就会执行connectionMade()方法,而当服务器收到客户端通过网络发送的一些数据时,就会调用dataReceived()方法。reactor会作为该方法的一个参数在数据中传输,这样就能在无需自己提取它的情况下访问它。

此外, 传输实例对象解决了如何与客户端通信的问题。可以看到这个例子里如何在connectionMade()中使用它来获取主机信息,这些是关于与我们进行连接的客户端的信息,以及如何在dataReceived()中将数据返回给客户端。

在服务器代码的最后一部分,创建了一个协议工厂。之所以被称为工厂,是因为每次得到一个接入连接时,都能“制造”协议的一个实例。然后在ractor中安装一个TCP监听器,以此检查服务请求。当它接收到一个请求时,就会创建一个TSServProtocol实例来处理那个客户端的事务。

创建Twisted Reactor TCP 客户端

示例代码:

from twisted.internet import protocol, reactorHOST = 'localhost'
PORT = 21567class TSClntProtocol(protocol.Protocol):def sendData(self):data = input('> ')if data:print('sending {}'.format(data))self.transport.write(data.encode('utf-8'))else:self.transport.loseConnection()def connectionMade(self):self.sendData()def dataReceived(self, data):print(data.decode('utf-8'))self.sendData()class TSClntFactory(protocol.ClientFactory):protocol = TSClntProtocolclientConnectionLost = clientConnectionFailed = lambda self, connector, reason: reactor.stop()reactor.connectTCP(HOST, PORT, TSClntFactory())
reactor.run()

在客户端的代码中,也是通过重写connectionMade()和dataReceived()方法来扩展Protocol,并且这两者都会以与服务器相同的原因来执行。另外,还添加了自己的方法sendData(), 当需要发送数据时就会调用它。

因为是客户端,所以是开启与服务器对话的一端。一旦建立了连接,就进行第一步,即发送一条消息。服务器回复之后,我们将接受到的消息显示在屏幕上,并向服务器发送另一个消息。

以上行为会在一个循环中继续,直到当提示输入时我们不输入任何内容来关闭连接。此时,并非调用传输对象的write()方法发送另一个消息到服务器,而是执行loseConnection()来关闭套接字。当发生这种情况时,将调用工厂的 clientConnectionLost() 方法以及停止ractor,结束脚本执行。此外,如果因为某些其他的原因而导致系统调用了clientConnectionFailed(), 也会停止ractor.

在脚本最后创建了一个客户端工厂,创建一个到服务器的连接并运行ractor. 注意,这里实例化了客户端工厂,而不是将其传给reactor。这是因为我们不是服务器,需要等待客户端的连接,且服务器的工厂需要为每一次的连接都创建一个新的协议对象。我们这里是一个客户端,所以创建单个连接到服务器的协议对象。

Twisted 框架简介相关推荐

  1. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

  2. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  3. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  4. WPF Interaction框架简介(一)——Behavior

    原文:WPF Interaction框架简介(一)--Behavior 在WPF 4.0中,引入了一个比较实用的库--Interactions,这个库主要是通过附加属性来对UI控件注入一些新的功能,除 ...

  5. go语言学习(二)——Gin 框架简介

    GoWeb开发有很多框架,如Beego.Gin.Revel.Echo.IRis等,学习框架可以快速做开发,对比常见goweb框架,通过其github的活跃度,维护的team,生产环境中的使用率以及师兄 ...

  6. Java开源——常见J2EE框架简介

    Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...

  7. 【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )

    文章目录 一.EventBus 事件总线框架简介 二.EventBus 使用流程 一.EventBus 事件总线框架简介 Android 中的事件传递机制 : 使用 Intent 在组件间传递信息 ; ...

  8. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

  9. PHP微信开发框架LaneWeChat框架简介

    框架名称:LaneWeChat 微信PHP开发框架 框架版本:1.4 框架简介:这是一个为快速开发微信应用而生的PHP框架.将微信的开发者功能根据文档进行了封装.为了快速开发的目的,开发者完全不需要要 ...

最新文章

  1. 具有absolute、relative、fixed的div设置宽度和高度的效果
  2. jmeter定时器的使用_jmeter压测学习30定时器之固定定时器(sleep等待时间)
  3. 《数据分析变革:大数据时代精准决策之道》一第1章 了解运营型分析
  4. gentoo.tw的临时解决方法[转贴]
  5. 【英语学习】【Daily English】U03 Leisure Time L03 Hiking and camping are some of his favorites.
  6. 疑似华为P30系列售价曝光:欧洲售价最高8400元
  7. linux 安装 中文输入法,[linux]安装中文输入法
  8. 人脸生成识别 Towards Pose Invariant Face Recognition in the Wild
  9. 我的天哪我有博客了!
  10. 工程项目进度表excel模板_救命,每天都要做工作报告!Excel一键生成精美报告的技巧,必学!...
  11. DevExpress Dashboard for .NET简化商业智能开发
  12. ppt插入html(用office而不是wps)
  13. 自定义elementUI select下拉框样式
  14. FatSecret Platform API
  15. Siebel系统中配置LDAP认证
  16. Win32从入门到放弃
  17. 原生JS判断两个元素是否为兄弟节点
  18. IPD中的DCP评审
  19. 用vue写一个npm包(package),发布及引用
  20. CSS高手布局:让footer完美处于网页下方

热门文章

  1. 【FFMPEG】错误 Invalid filterchain containing an unlabelled output pad
  2. 上交所科创50ETF期权来了!
  3. vs2008安装失败解决过程
  4. 百融金服榕树FICO信用评分,百融金服榕树数据+模型服务
  5. Windows Server 2003系统重装步骤
  6. 多文件程序X32dbg动态调试
  7. VisualStudio的x64和x32默认配置
  8. 总结:三种昆虫天敌标本的制作方法
  9. iOS-申请邓白氏编码的超详细流程介绍(2017.06.12)
  10. 在云原生舞台上,一定有灵雀云的一个重要位置