python网络框架Twisted
什么是Twisted
Twisted是一个用python语言写的事件驱动网络框架,它支持很多种协议,包括UDP,TCP,TLS和其他应用层协议,比如HTTP,SMTP,NNTM,IRC,XMPP/Jabber。
一个Twisted程序由reactor发起的主循环和一些回调函数组成。当事件发生了,比如一个client连接到了server,这时候服务器端的事件会被触发执行。
官方的简单例子启动Twisted:
- from twisted.internet import reactor
- def hello():
- print('Hello from the reactor loop!')
- print('Lately I feel like I\'m stuck in a rut.')
- # 将函数hello传入reactor
- reactor.callWhenRunning(hello)
- print('Starting the reactor.')
- # 启动reactor后调用hello函数
- reactor.run()
退出Twisted:
- from twisted.internet import reactor
- class Countdown(object):
- counter=5
- def count(self):
- if self.counter==0:
- # 停止reactor的循环监听
- reactor.stop()
- else:
- print(self.counter,"...")
- self.counter-=1
- # 注册一个回调函数第一个参数是几秒回调,第二个参数是回调函数
- reactor.callLater(1,self.count)
- reactor.callWhenRunning(Countdown().count)
- print("start")
- reactor.run()
- print("stop!")
- #执行结果
- start
- 5 ...
- 4 ...
- 3 ...
- 2 ...
- 1 ...
- stop!
twisted中出现异常,程序并不会崩溃:
- from twisted.internet import reactor
- # 异常函数
- def falldown():
- raise Exception('I fall down.')
- # 重启函数
- def upagain():
- print('But I get up again.')
- # 注销stop,程序会继续执行,并不会崩溃,说明twisted的健壮性
- reactor.stop()
- reactor.callWhenRunning(falldown)
- reactor.callWhenRunning(upagain)
- print('Starting the reactor.')
- reactor.run()
用Twisted写一个简单的TCP服务器
下面的代码是一个TCPServer,这个server记录客户端发来的数据信息。
- import sys
- from twisted.internet.protocol import ServerFactory
- from twisted.protocols.basic import LineReceiver
- from twisted.python import log
- from twisted.internet import reactor
- class CmdProtocol(LineReceiver):
- # 分隔符
- delimiter = "\n"
- # 连接成功事件,可重载
- def connectionMade(self):
- # 获取客户端的ip
- # getPeer获取客户端信息
- # getHost获取服务端信息
- self.client_ip=self.transport.getPeer().host# 日志记录来访客户端的ip
- log.msg("Client connection from %s" % self.client_ip)
- # 如果连接的客服端数量大于最大连接数,那么就关闭连接
- if len(self.factory.clients)>=self.factory.clients_max:
- log.msg("Too many connections. bye !")
- self.client_ip=None
- # 关闭连接
- self.transport.loseConnection()
- else:
- self.factory.clients.append(self.client_ip)
- # 连接断开事件,可重载,依靠reason区分断开类型
- def connectonLost(self,reason):
- log.msg('Lost client connection. Reason: %s' % reason)
- if self.client_ip:
- self.factory.clients.remove(self.client_ip)
- # 继承父类的方法,用于分发事件,不要重载
- def lineReceived(self, line):
- log.msg('Cmd received from %s : %s' % (self.client_ip, line))
- class MyFactory(ServerFactory):
- # 指向一个协议类,我们自定义的
- protocol = CmdProtocol
- def __init__(self,clients_max=10):
- self.clients_max=clients_max
- self.clients=[]
- # 配置将日志输出到stdout
- log.startLogging(sys.stdout)
- reactor.listenTCP(9999,MyFactory(2))
- reactor.run()
- #在cmd中输入:
Telnet 127.0.0.1 9999 测试
python网络框架Twisted的更多相关文章
- python 网络框架twisted基础学习及详细讲解
twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本.Protocol:Protoc ...
- 事件驱动之Twsited异步网络框架
在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...
- python2.0_s12_day10_Twsited异步网络框架
Twsited异步网络框架 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. Package application Configu ...
- linux下Python网络编程框架-Twisted安装
Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...
- Python twisted事件驱动网络框架 源码剖析
一.Twisted简介 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. 事件驱动简而言之,事件驱动分为二个部分:第一,注册事件:第 ...
- 为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?
twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用 ...
- uvloop —— 超级快的 Python 异步网络框架
简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...
- 浅谈Python Web 框架:Django, Twisted, Tornado, Flask, Cyclone 和 Pyramid
Django Django 是一个高级的 Python Web 框架,支持快速开发,简洁.实用的设计.如果你正在建一个和电子商务网站相似的应用,那你应该选择用 Django 框架.它能使你快速完成工作 ...
- 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码
下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...
随机推荐
- k8s 对接glusterfs存储
service 与 endpoint 是通过namespace相同,name相同,相互关联的 创建endpoint [root@k8s-master glusterfs]# cat glusterfs ...
- Spring Boot 整合 Druid && 配置数据源监控
1. 导入 Druid 包 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid& ...
- 协方差及matlib绘制
转自http://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学的基本概念 统计学里最基本的概念就是样本的均值.方差.标准差.首先,我们给定一个含有n个 ...
- Activiti学习笔记11 — 判断节点的使用
一. 创建流程 <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns=" ...
- Tomcat相关知识总结
有关Tomcat的杂货店 一.修改端口号,并以IP访问 1.确保80端口没有程序占用.例如nginx等. 2.vi /tomcat/conf/server.xml 3.找到<Connector ...
- android发编译
普通的反编译http://blog.csdn.net/vipzjyno1/article/details/21039349/ 反编译os http://gikir.com/blog/?p=115 ht ...
- vue 父子组件传递数据
单向数据流: 数据从父级组件传递给子组件,只能单向绑定. 子组件内部不能直接修改从父级传递过来的数据. 解决方法: 可以使用data将父组件传递过来的数据拷贝一份存放起来,再修改拷贝的数据就可以了 / ...
- 14 win7 sp1下安装vs2015
0 引言 在win7下安装vs2015的时候遇到了很多问题,看了很多帖子,尝试了很多次,终于成功了.网上也有大量关于win7 sp1下安装vs2015的帖子,我在安装的时候也参考了很多相关经验,这次写 ...
- Js 数组的各种方法及操作
一.数组去重 var arr = [0,1,20,3,0,45,6,0]; Array.prototype.unrepeat = function(){ var array = []; for(var ...
- hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
题意: 给你一个数字拼图,问你数字拼图能否能复原成原来的样子. 题解: 数字拼图的性质是,逆序数奇偶相同时,可以互相转化,逆序数奇偶不同,不能互相转化. 因此统计逆序对即可. #include< ...