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. ...
随机推荐
- 20140421 常量指针与指针常量; const指针; reinterpret_cast ;const_cast作用
1.reinterpret_cast<type_id>(表达式)的作用: type-id 必须是一个指针.引用.算术类型.函数指针或者成员指针.它可以把一个指针转换成一个整数,也可以把一个 ...
- nodejs中命令行和node交互模式的区分
来自:廖雪峰教程 么么哒~ 命令行模式和Node交互模式 请注意区分命令行模式和Node交互模式. 看到类似C:\>是在Windows提供的命令行模式: 在命令行模式下,可以执行node进入No ...
- 将Mysq数据导入solr索引库
本文的基础环境都是在centos 64bit,jdk1.7.79 将mysql 的jar 包添加到/home/hadoop/cloudsolr/solr-4.10.4/contrib/dataimpo ...
- 「LibreOJ NOI Round #2」签到游戏
题目 瞎猜一下我们只要\(n\)次询问就能确定出\(\{A_i\}\)来 感受一下大概是询问的区间越长代价就越小,比如询问\([l,n]\)或\([1,r]\)的代价肯定不会超过\([l,r]\) 所 ...
- Crane /// 向量旋转+线段树
题目大意: 给定n条首尾相接的线段的长度 第一条从0,0开始,所有线段垂直与x轴向上延伸 给定c次操作 每次操作给定 s,a 使得 由第s条线段的角度 逆时针旋转a后 达到第s+1条线段的角度 每次操 ...
- navicat远程连接报1045 access denied for user'root'@'ip'(using pasword:yes".............
这个其实很简单,授权就行了.如下 1.GRANT ALL PRIVILEGES ON *.* TO'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;2 ...
- pdfkit
官方文档 0.准备 需要引入两个包,首先要npm install pdfkit安装pdfkit包 const PDF = require('pdfkit'); const fs = require(' ...
- Android开发 retrofit入门讲解
前言 retrofit基于okhttp封装的网络请求框架,网络请求的工作本质上是 OkHttp 完成,而 retrofit 仅负责网络请求接口的封装.如果你不了解OKhttp建议你还是先了解它在来学习 ...
- [JZOJ1900] 【2010集训队出题】矩阵
题目 题目大意 题目化简一下,就变成: 构造一个\(01\)数列\(A\),使得\(D=\sum A_iA_jB_{i,j}-\sum A_iC_i\)最大. 问这个最大的\(D\)是多少. 正解 其 ...
- C++——友元函数和友元类
友元函数:让函数可以访问类的私有属性 #include <iostream> using namespace std; class A { public: friend class B;/ ...