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. ...
随机推荐
- C#Object与XML文件或二进制文件之间的转化
Object To Xml 文件 public static bool Serializer<T>(object obj, string path) { FileStream xmlfil ...
- iOS开发系列-支付宝支付
概述 开发中支付通常都会集成支付宝支付,下面讲解支付宝的整体流程. 集成支付宝支付的流程 签约 与支付签约,得到获取商户的ID(partner).账户ID(seller).私钥privateKey. ...
- override new 的区别
override : 方法提供从基类继承的成员的新实现. 通过 override 声明重写的方法称为重写基方法. 重写基方法必须具有与 override方法相同的签名 new : 关键字可以显式隐藏从 ...
- CCPC-WFinal-女生专场
1001:CCPC直播 字符串处理,几个if语句 1002:口算训练 前缀和处理<=根号n的因数,大于根号n的因数每个数至多有一个,用vector存下每个大因数的位置,map离散化.查询 ...
- 贪心+MST——cf1095F
开始看错求最短路了.. 但是MST的思路和最短路也差不多 就是先不考虑特殊边,用最小点做一个生成树 然后加入特殊边,进行一次krus即可 #include<bits/stdc++.h> # ...
- platform模块和ctypes模块
一.ctypes模块 Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库的形式,即 Windows 下的 .dll 文件,或者 Linux 下的 .so 文件.先来看一下 ...
- (转)JS的splice()方法在for循环中的使用问题
在写JS代码时,我们常常使用 splice 函数来删除数组中的元素,因为 splice 函数会直接对数组进行修改,从而不需再自己写一个算法来移动数组中的其他元素填补到被删除的位置.splice 功能十 ...
- ul列表元素在float:right后li元素倒转
发现对li元素进行float:right后,虽然成功右浮动,但是的元素是倒转的 解决方案: 对ul进行右浮动,然后对li左浮动 结果
- Berlekamp Massey算法求线性递推式
BM算法求求线性递推式 P5487 线性递推+BM算法 待AC. Poor God Water // 题目来源:ACM-ICPC 2018 焦作赛区网络预赛 题意 God Wate ...
- PHP面向对象之继承的基本思想
图例 概念和说明 代码展示 <?php header('content-type:text/html;charset=utf-8'); //学生考试系统 class Student{ publi ...