什么是Twisted

Twisted是一个用python语言写的事件驱动网络框架,它支持很多种协议,包括UDP,TCP,TLS和其他应用层协议,比如HTTP,SMTP,NNTM,IRC,XMPP/Jabber。

一个Twisted程序由reactor发起的主循环和一些回调函数组成。当事件发生了,比如一个client连接到了server,这时候服务器端的事件会被触发执行。

官方的简单例子启动Twisted:

  1. from twisted.internet import reactor
  2.  
  3. def hello():
  4. print('Hello from the reactor loop!')
  5. print('Lately I feel like I\'m stuck in a rut.')
  6.  
  7. # 将函数hello传入reactor
  8. reactor.callWhenRunning(hello)
  9. print('Starting the reactor.')
  10. # 启动reactor后调用hello函数
  11. reactor.run()

退出Twisted:

  1. from twisted.internet import reactor
  2.  
  3. class Countdown(object):
  4. counter=5
  5. def count(self):
  6. if self.counter==0:
  7. # 停止reactor的循环监听
  8. reactor.stop()
  9. else:
  10. print(self.counter,"...")
  11. self.counter-=1
  12. # 注册一个回调函数第一个参数是几秒回调,第二个参数是回调函数
  13. reactor.callLater(1,self.count)
  14.  
  15. reactor.callWhenRunning(Countdown().count)
  16.  
  17. print("start")
  18. reactor.run()
  19. print("stop!")
  20.  
  21. #执行结果
  22. start
  23. 5 ...
  24. 4 ...
  25. 3 ...
  26. 2 ...
  27. 1 ...
  28. stop!

twisted中出现异常,程序并不会崩溃:

  1. from twisted.internet import reactor
  2.  
  3. # 异常函数
  4. def falldown():
  5. raise Exception('I fall down.')
  6.  
  7. # 重启函数
  8. def upagain():
  9. print('But I get up again.')
  10. # 注销stop,程序会继续执行,并不会崩溃,说明twisted的健壮性
  11. reactor.stop()
  12.  
  13. reactor.callWhenRunning(falldown)
  14. reactor.callWhenRunning(upagain)
  15.  
  16. print('Starting the reactor.')
  17. reactor.run()

用Twisted写一个简单的TCP服务器

下面的代码是一个TCPServer,这个server记录客户端发来的数据信息。

  1. import sys
  2.  
  3. from twisted.internet.protocol import ServerFactory
  4. from twisted.protocols.basic import LineReceiver
  5. from twisted.python import log
  6. from twisted.internet import reactor
  7.  
  8. class CmdProtocol(LineReceiver):
  9. # 分隔符
  10. delimiter = "\n"
  11.  
  12. # 连接成功事件,可重载
  13. def connectionMade(self):
  14. # 获取客户端的ip
  15. # getPeer获取客户端信息
  16. # getHost获取服务端信息
  17. self.client_ip=self.transport.getPeer().host# 日志记录来访客户端的ip
  18. log.msg("Client connection from %s" % self.client_ip)
  19. # 如果连接的客服端数量大于最大连接数,那么就关闭连接
  20. if len(self.factory.clients)>=self.factory.clients_max:
  21. log.msg("Too many connections. bye !")
  22. self.client_ip=None
  23. # 关闭连接
  24. self.transport.loseConnection()
  25. else:
  26. self.factory.clients.append(self.client_ip)
  27.  
  28. # 连接断开事件,可重载,依靠reason区分断开类型
  29. def connectonLost(self,reason):
  30. log.msg('Lost client connection. Reason: %s' % reason)
  31. if self.client_ip:
  32. self.factory.clients.remove(self.client_ip)
  33.  
  34. # 继承父类的方法,用于分发事件,不要重载
  35. def lineReceived(self, line):
  36. log.msg('Cmd received from %s : %s' % (self.client_ip, line))
  37.  
  38. class MyFactory(ServerFactory):
  39. # 指向一个协议类,我们自定义的
  40. protocol = CmdProtocol
  41.  
  42. def __init__(self,clients_max=10):
  43. self.clients_max=clients_max
  44. self.clients=[]
  45.  
  46. # 配置将日志输出到stdout
  47. log.startLogging(sys.stdout)
  48. reactor.listenTCP(9999,MyFactory(2))
  49. reactor.run()
  50.  
  51. #在cmd中输入:
    Telnet 127.0.0.1 9999 测试

python网络框架Twisted的更多相关文章

  1. python 网络框架twisted基础学习及详细讲解

    twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本.Protocol:Protoc ...

  2. 事件驱动之Twsited异步网络框架

    在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...

  3. python2.0_s12_day10_Twsited异步网络框架

    Twsited异步网络框架 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. Package application Configu ...

  4. linux下Python网络编程框架-Twisted安装

    Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...

  5. Python twisted事件驱动网络框架 源码剖析

    一.Twisted简介 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. 事件驱动简而言之,事件驱动分为二个部分:第一,注册事件:第 ...

  6. 为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

    twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用 ...

  7. uvloop —— 超级快的 Python 异步网络框架

    简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...

  8. 浅谈Python Web 框架:Django, Twisted, Tornado, Flask, Cyclone 和 Pyramid

    Django Django 是一个高级的 Python Web 框架,支持快速开发,简洁.实用的设计.如果你正在建一个和电子商务网站相似的应用,那你应该选择用 Django 框架.它能使你快速完成工作 ...

  9. 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码

    下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...

随机推荐

  1. k8s 对接glusterfs存储

    service 与 endpoint 是通过namespace相同,name相同,相互关联的 创建endpoint [root@k8s-master glusterfs]# cat glusterfs ...

  2. Spring Boot 整合 Druid && 配置数据源监控

    1. 导入 Druid 包 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid& ...

  3. 协方差及matlib绘制

    转自http://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学的基本概念 统计学里最基本的概念就是样本的均值.方差.标准差.首先,我们给定一个含有n个 ...

  4. Activiti学习笔记11 — 判断节点的使用

    一. 创建流程 <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns=" ...

  5. Tomcat相关知识总结

    有关Tomcat的杂货店 一.修改端口号,并以IP访问 1.确保80端口没有程序占用.例如nginx等. 2.vi /tomcat/conf/server.xml 3.找到<Connector ...

  6. android发编译

    普通的反编译http://blog.csdn.net/vipzjyno1/article/details/21039349/ 反编译os http://gikir.com/blog/?p=115 ht ...

  7. vue 父子组件传递数据

    单向数据流: 数据从父级组件传递给子组件,只能单向绑定. 子组件内部不能直接修改从父级传递过来的数据. 解决方法: 可以使用data将父组件传递过来的数据拷贝一份存放起来,再修改拷贝的数据就可以了 / ...

  8. 14 win7 sp1下安装vs2015

    0 引言 在win7下安装vs2015的时候遇到了很多问题,看了很多帖子,尝试了很多次,终于成功了.网上也有大量关于win7 sp1下安装vs2015的帖子,我在安装的时候也参考了很多相关经验,这次写 ...

  9. Js 数组的各种方法及操作

    一.数组去重 var arr = [0,1,20,3,0,45,6,0]; Array.prototype.unrepeat = function(){ var array = []; for(var ...

  10. hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对

    题意: 给你一个数字拼图,问你数字拼图能否能复原成原来的样子. 题解: 数字拼图的性质是,逆序数奇偶相同时,可以互相转化,逆序数奇偶不同,不能互相转化. 因此统计逆序对即可. #include< ...