安装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)
在这里,connectionMade
和connectionLost
共同在一个共享的对象中维护着一个活动的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()
在这个例子中,我创建了一个protocol
的Factory
,我想要告诉这个工厂类,他的工作是为我构建一个protocol
的实例对象,所以我设定他的buildProtocol
方法返回一个QOTD
对象。之后,我想要去监听TCP的端口,所以我使用了一个TCP4ServerEndpoint
去标识这个我想要去绑定监听的端口,通过这个工厂类,我仅仅是创建了他的listen
方法。
endpoint.listen()
告诉reactor
用一个特定的protocol
去处理来自该endpoint
监听的地址的网络连接。reactor.run()
启动这个reactor
并永远等待网络连接到达你特定的端口地址。如果要终止,可以在命令行终端输入Control + C
或者调用reactor.stop()
方法。