什么是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的更多相关文章

  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. css样式高级技巧-选择器

    用<div>元素为网页 在编写样式表时,我们经常要用div元素来包装内容: <div> <p>Here are two paragraphs of content& ...

  2. 关于ctype.h头文件使用说明

    ctype.h里的函数概况: 1.字符测试函数 (1)函数原型均为 int isXXX( int ch) (2)参数为int,任何参数均被转换为整形 (3)只能处理[0,127]之间的值 2.字符映射 ...

  3. git mac安装

    1.git安装包安装 去官网下载最行的git版本 安装即可 https://git-scm.com/download/mac 但是一般的git仓库需要sshkey来做验证 下面奉上具体的命令: 需要生 ...

  4. [转]关于Repository模式

    原文链接:关于Repository模式 定义(来自Martin Fowler的<企业应用架构模式>): Mediates between the domain and data mappi ...

  5. 2019-7-3-Roslyn-在项目文件使用条件判断

    title author date CreateTime categories Roslyn 在项目文件使用条件判断 lindexi 2019-7-3 17:7:32 +0800 2018-8-3 2 ...

  6. FaceNet pre-trained模型以及FaceNet源码使用方法和讲解

    Pre-trained models Model name LFW accuracy Training dataset Architecture 20180408-102900 0.9905 CASI ...

  7. android 自定义shape 带阴影边框效果

    在drawable 里面 建立一个 xml 直接复制 看效果 自己调试就可以 <?xml version="1.0" encoding="utf-8"?& ...

  8. Java 多线程 - ThreadLocal

    ref: https://www.cnblogs.com/chengxiao/p/6152824.html

  9. thinkphp url生成

    为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响. 定义规则 ...

  10. 关于css布局的定位问题

    虽然职位说是PHP程序,但实际上什么都要做些,排版当然也免不了了,以前自己做网站时就能排出网页了,但是很多东西不系统,有点走马观花,例如关于这个css布局定位的问题就是,今天特意总结了一下,知识这东西 ...