Twisted 框架 初印象

上面是twisted官网推荐的书籍,从封面可以看到,是一堆大蟒(python)纠缠在一起,这里可以说明twisted是一个基于pyhton语言,支持各种网络协议(包括UDP,TCP,TLS和其他应用层协议,比如HTTP,SMTP,NNTM,IRC,XMPP/Jabber。)使用(纠缠)的较低层的通信框架,twisted框架已经实现了这些协议,我们只需要使用就行了。另外twisted框架是基于事件驱动

下面是搬运官网的例子:

TCP服务器

from twisted.internet import protocol, reactor, endpoints class Echo(protocol.Protocol):
    def dataReceived(self, data):
        self.transport.write(data)
class EchoFactory(protocol.Factory):
    def buildProtocol(self, addr):
       return Echo()

endpoints.serverFromString(reactor, "tcp:1234").listen(EchoFactory()) reactor.run()

  

web服务器

from twisted.web import server, resource
from twisted.internet import reactor, endpoints class Counter(resource.Resource):
    isLeaf = True
    numberRequests = 0
    def render_GET(self, request):
        self.numberRequests += 1
        request.setHeader(b"content-type", b"text/plain")
        content = u"I am request #{}\n".format(self.numberRequests)                                                                                      return content.encode("ascii") endpoints.serverFromString(reactor, "tcp:8080").listen(server.Site(Counter()))                                               

reactor.run()                

聊天室

from twisted.internet import reactor, protocol, endpoints
from twisted.protocols import basic

class PubProtocol(basic.LineReceiver):
    def __init__(self, factory):
        self.factory = factory

    def connectionMade(self):
        self.factory.clients.add(self)

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

    def lineReceived(self, line):
        for c in self.factory.clients:
            source = u"<{}> ".format(self.transport.getHost()).encode("ascii")
            c.sendLine(source + line)

class PubFactory(protocol.Factory):
    def __init__(self):
        self.clients = set()

    def buildProtocol(self, addr):
        return PubProtocol(self)

endpoints.serverFromString(reactor, "tcp:1025").listen(PubFactory())
reactor.run()

你可以使用打开两个命令行终端,使用 telnet localhost 1025, 然后在每个终端输入。

邮件客户端

twisted 包含了一个复杂的 imap4 客户端库

from __future__ import print_function

import sys

from twisted.internet import protocol, defer, endpoints, task
from twisted.mail import imap4
from twisted.python import failure

@defer.inlineCallbacks
def main(reactor, username="alice", password="secret",
         strport="tls:example.com:993"):
    endpoint = endpoints.clientFromString(reactor, strport)
    factory = protocol.Factory.forProtocol(imap4.IMAP4Client)
    try:
        client = yield endpoint.connect(factory)
        yield client.login(username, password)
        yield client.select(‘INBOX‘)
        info = yield client.fetchEnvelope(imap4.MessageSet(1))
        print(‘First message subject:‘, info[1][‘ENVELOPE‘][1])
    except:
        print("IMAP4 client interaction failed")
        failure.Failure().printTraceback()

task.react(main, sys.argv[1:])

总结

twisted 是一个封装了各个网络协议,基于事件循环驱动的框架。

1. 要使用twisted框架,需实现一个twisted Protocol类的客户端或服务器类,重写其dataReceived,

定义接受到对端数据时的处理方法。

2. 对于服务器类(客户端类),还要实现一个twisted Factory(ClientFactory)类,用来管理Protocol类,当有新的客户端连接时,框架调用

Factory.buildProtocol()返回Protocol类去处理相应连接。

3. 使用twisted  相应的listen/connect方法,监听/连接对端服务。

4. 最后,调用twisted的事件循环处理类reactor.run(),启动事件循环。

下面是twisted的关键术语:

BaseProtocol

twisted框架所有协议类的基类,其实现了两个关键方法,makeConnection和connectionMade。

makeConnection继承给子类,一般我们不使用此方法;

connctionsMade继承给子类,子类重写该方法。在客户端连接建立时调用,可以做一些鉴权之类的操作,也可以限制客户端的连接总数。

class BaseProtocol:
"""
This is the abstract superclass of all protocols.

Some methods have helpful default implementations here so that they can
easily be shared, but otherwise the direct subclasses of this class are more
interesting, L{Protocol} and L{ProcessProtocol}.
"""
connected = 0
transport = None

def makeConnection(self, transport):
"""Make a connection to a transport and a server.

This sets the ‘transport‘ attribute of this Protocol, and calls the
connectionMade() callback.
"""
self.connected = 1
self.transport = transport
self.connectionMade()

def connectionMade(self):
"""Called when a connection is made.

This may be considered the initializer of the protocol, because
it is called when the connection is completed. For clients,
this is called once the connection to the server has been
established; for servers, this is called after an accept() call
stops blocking and a socket has been received. If you need to
send any greeting or initial message, do it here.

  

Protocol

from twisted.internet.protocol import Protocol

twisted框架为基于TCP协议等上层协议定义的基类(基于UDP协议的是DatagramProtocol,from twisted.internet.protocol import Protocol),服务端和客户端都需继承此类。

其api十分简单,重写dataReceived方法支持客户端有数据发送时的逻辑;重写connectionLost方法,可以根据失败原因做一些错误处理。

class Protocol(BaseProtocol):
"""
This is the base class for streaming connection-oriented protocols.

If you are going to write a new connection-oriented protocol for Twisted,
start here. Any protocol implementation, either client or server, should
be a subclass of this class.

The API is quite simple. Implement L{dataReceived} to handle both
event-based and synchronous input; output can be sent through the
‘transport‘ attribute, which is to be an instance that implements
L{twisted.internet.interfaces.ITransport}. Override C{connectionLost} to be
notified when the connection ends.

Some subclasses exist already to help you write common types of protocols:
see the L{twisted.protocols.basic} module for a few of them.
"""

def logPrefix(self):
"""
Return a prefix matching the class name, to identify log messages
related to this protocol instance.
"""
return self.__class__.__name__

def dataReceived(self, data):
"""Called whenever data is received.

Use this method to translate to a higher-level message. Usually, some
callback will be made upon the receipt of each complete protocol
message.

@param data: a string of indeterminate length. Please keep in mind
that you will probably need to buffer some data, as partial
(or multiple) protocol messages may be received! I recommend
that unit tests for protocols call through to this method with
differing chunk sizes, down to one byte at a time.
"""

def connectionLost(self, reason=connectionDone):
"""Called when the connection is shut down.

Clear any circular references here, and any external references
to this Protocol. The connection has been closed.

@type reason: L{twisted.python.failure.Failure}

  

Factory

from twisted.internet.protocol import Factory

twisted中的Factory子类起到对Protocol类的管理作用,当有新的客户端连接时,框架会调用Factory.buildProtocol(),此时,用户需在此时将自定义的Protocol实例传进去,并且作为该函数的返回值。

ClientFactory

from twisted.internet.protocol import ClientFactory

实现客户端连接程序管理的工厂类,需用reactors.connectXXX(如connectTCP) 指定与使用哪种网络协议的服务器通信。

ClientFactory继承自Factory类,但是比Factory多了3个可以重写的事件响应函数,即startedConnecting()在建立连接时被调用;clientConnectionLost()在连接断开时被调用;

clientConnectionFailed()在连接建立失败时被调用。

时间: 2024-10-19 01:13:48

Twisted 框架 初印象的相关文章

OpenCL学习笔记(一):摩尔定律、异构计算与OpenCL初印象

关于摩尔定律: 摩尔定律1965年提出,晶体管密度是按照每年翻倍发展的,之后的趋势也是这样--每一代芯片的的时钟频率提高50%,而同时工艺节点减小了0.3,功耗密度翻倍(保持功耗相同的情况下,面积0.7*0.7=0.49,因此提高频率使得性能提升了):而在2000年中期之后,出现了物理尺寸更小的器件,意味着,我们没有办法保持功耗密度不变,而同时提高频率,结果我们看到自此之后,时钟频率并没有显著提高,需要通过并行来提高性能,所以多核CPU流行起来.即使是最基本的处理器,超标量和无序指令执行等高级体

Vue.js之初印象

一.背景 MVVM模式,很多人在说在用,好吧,我落后了,我目前的项目木有用到MVVM模式的框架,vuejs,reactjs,angularjs,nonono,自己去捣鼓过ng,项目木有用到.实在不敢称自己是front-end developer.趁这个失业期,vuejs的学习起哟. 二.简介 1.vue.js是什么 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们

初印象至Vue路由

初印象系列为快速了解一门技术的内容,后续会推出本人应用这门技术时发现的一些认识. Vue路由和传统路由的区别: Vue路由主要是用来实现单页面应用内各个组件之间的切换,同样支持传递参数等功能.而传统路由使用超链接 以下内容来自官网,js使用ES6 如何在vue项目中使用vue-router HTML <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="htt

软件测试学习笔记week 3 --- 测试框架初体验

测试框架初体验 在这周的软件测试课上,第一次了解了软件测试框架的概念.软件测试框架包含的范围非常广,从自动化测试框架到单元测试框架以及性能测试框架.在上个寒假中,在学习Coursera的在线课程时发现普林斯顿的单元测试做得非常强大,从程序正确性到Time consuming甚至Memory consuming,几乎能发现程序中的每一处错误或者缺陷.因此,在上完了这周的课程后,我查阅了一些资料,做了这篇随笔记录了解到的单元测试的知识. 一.什么是测试框架 要认识测试框架,首先要对所谓框架有概念.框

uml时序图的初印象-------Day64

最近有好多想法迫不及待的想去实现,可是事实上是在那些最开始想的非常明白,感觉会没问题的地方也总是会出现问题,导致略微有些急躁,还是要淡定啊,又到了周末,明后天要收拾东西搬家,不知道宽带能不能顺利的给挪过去,想提前来记录下这周的工作吧. 总的来说,这周完成了界面的初始设计,然后就是这概要设计了,结果整合下来,word文档都有近百页了,太多时序图了,画的我都有些头昏脑涨.其实,在很久之前的某公司,我面试的第一道问题就是时序图,结果当时的我是可怜的一片茫然,结果也就自然而然了.这次再看时序图,又理解了

gulp初印象

几个月前三木君向我推荐过gulp,到现在因为工作需要才接触到它,真的很惭愧,在此记录下对gulp的初印象. 全局安装: $ npm install –global gulp 一个gulpfile.js文件: 这个文件需要在项目的根目录下创建.默认任务(什么也不做): var gulp = require('gulp'); gulp.task('default', function() { // place code for your default task here }); 下面的命令将执行这

AVFoundation 框架初探究(二)

接着第一篇总结 系列第一篇地址:AVFoundation 框架初探究(一) 在第一篇的文章中,我们总结了主要有下面几个点的知识: 1.对AVFoundation框架整体的一个认识 2.AVSpeechSynthesizer这个文字转音频类 3.AVAudioPlayer音频播放类 4.AVAudioRecorder音频录制类 5.AVAudioSession音频会话处理类 上面第一篇说的内容,大致都是关于上面总结的,接着说说我们这第二篇总结什么?其实刚开始的时候,我是想按照<AVFoundati

Django初印象之视图(view)

一.view的初印象 一个视图函数(类),简称视图.我们发起web请求时,返回的web响应.[大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中.] 二.普通view的样子 下面是一个以HTML文档的形式返回当前日期和时间的视图: from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.

Twisted框架学习

Twisted是用Python实现的基于事件驱动的网络引擎框架,是python中一个强大的异步IO库.理解twisted的一个前提是弄清楚twisted中几个核心的概念: reactor, Protocl, ProtocolFactory, Deffered  1 reactor twisted.internet.reactor https://twistedmatrix.com/documents/current/core/howto/reactor-basics.html reactor是t