Twisted入门文档——1

安装Twisted

在本地机器上想要使用Twisted,使用如下命名即可快速安装:

pip install twisted

简介

Twisted是一个可以快速为开发者开发构建网络应用程序的开发平台。虽然说python其本身是一个很强大的编程语言,但是其仍然缺乏很多其他编程语言花了大功夫而添加的功能和特性。
Twisted是一个(从某种特殊的意义上来说)纯粹的python开发框架或者叫做开发库,他取决于你如何去使用他,并且他也在不断地完善之中。

Twisted 核心功能

编写服务端程序

概览

这部分文档将告诉你如何通过twisted来构建一个TCP网络协议解析和网络处理.(这些相同的代码可以重复用在SSL和UNIX套接字服务中)

你自己实现的网络协议处理类通常会被归为twisted.internet.protocol.Protocol。大多数的网络协议处理类要么继承该类,要么是继承于他的一个子类。协议类的实例按需在每个连接中实例化,并在连接结束时消失。这意味着持久配置不会保存在Protocol中。

这个持久的配置将会保存在一个叫做Factory的class中,这个类通常指的的是twisted.internet.protocol.Factory。里面的buildProtocol方法被用来为每个新的连接创建一个Protocol

能够在多个端口或网络地址上提供相同的服务通常是有用的。这就是为什么Factory并不去监听任何一个连接,事实上,他根本不知道任何关于网络的信息。

Protocol

在上文提到过,辅助类和函数方法是主要的代码。一个twisted的protocol是以一个异步(asynchronous)的方式来处理网络数据的。当事件从网络中到达的时候,Protocol即刻响应,同时事件以对protocol方法的调用的方式到达的。

下面是一个简单的例子:

from twisted.internet.protocol import Protocol

class Echo(Protocol):
    def dataReceived(self, data):

        self.transport.write(data) # 将从网络接收到的信息直接返回

这就是一个简单的例子,简单的写回从网络中写入的数据,但是并不是对所有的事件都响应。下面是另外一个例子反应了Protocol对另外一个事件的响应:

from twisted.internet.protocol import Protocol

class QOTD(Protocol):

    def connectionMade(self):
        self.transport.write("An apple a day keeps the doctor away\r\n")
        self.transport.loseConnection() # 即刻关闭连接

这个protocol响应一个已知的初始连接,响应之后,即刻关闭该连接。

  • connectionMade事件往往是在设置连接对象的地方
  • connectionLost事件是销毁任何特定于连接的对象的地方。

下面是一个例子:

from twisted.internet.protocol import Protocol

class Echo(Protocol):

    def __init__(self, factory):
        self.factory = factory
    
    def connectionMade(self):
        self.factory.numProtocols = self.factory.numProtocols + 1
        self.transport.write("Welcome! There are currently {0} open connections.\n".format(self.factory.numProtocols))

    def connectionLost(self, reason):
        self.factory.numProtocols -= 1

    def dataReceived(self, data):
        self.transport.write(data)

在这里,connectionMadeconnectionLost共同在一个共享的对象中维护着一个活动的protocol数量。工厂类在创建一个Echo实例的时候,必须执行__init__方法。工厂用来共享那些任何给定的连接中超过生命周期的状态信息。

loseConnection() and abortConnection()

在上述的代码中,loseConnection()在我们调用transport.write()之后立即被调用。loseConnection()调用在这里是安全的,并不需要担心会有数据丢失,因为其只会在所有被twisted写的数据全部输出到操作系统中的时候,才会关闭连接。如果一个生产者正在被transport使用,loseConnection()只会关闭那些没有注册的生产者的连接。

在其他的一些场景中,一直等待着数据被完全写出并不是我想要看到的结果。由于对方的网络故障、bug以及一些恶意连接,数据很有可能无法交付,即使我们使用的loseConnection()是一个安全的方法,不会导致数据丢失。在这种情况下,可以使用abortConnection()来解决这一问题。

abortConnection()将会立即关闭连接,不管在缓冲中是否还有没有交付的数据,或者即使是生产者仍然注册过,(Notes:abortConnection is only available in Twisted 11.1 and newer version.)

使用 Protocol

在这个模块,将会介绍如何用自定义的Protocol来启动一个网络服务。

from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internte import reactor

class QOTDFactory(Factoy):
    def buildProtocol(self, addr):
        return QOTD()

# 8007 是你指定的服务端口,这个端口是可以自己给定的
endpoint = TCP4ServerEndpoint(reactor, 8007)
endpoint.listen(QOTDFactory)
reactor.run()

在这个例子中,我创建了一个protocolFactory,我想要告诉这个工厂类,他的工作是为我构建一个protocol的实例对象,所以我设定他的buildProtocol方法返回一个QOTD对象。之后,我想要去监听TCP的端口,所以我使用了一个TCP4ServerEndpoint去标识这个我想要去绑定监听的端口,通过这个工厂类,我仅仅是创建了他的listen方法。

endpoint.listen()告诉reactor用一个特定的protocol去处理来自该endpoint监听的地址的网络连接。reactor.run()启动这个reactor并永远等待网络连接到达你特定的端口地址。如果要终止,可以在命令行终端输入Control + C或者调用reactor.stop()方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值