twisted 是一个事件驱动的网络开发框架,使用 python 开发。python
twisted 框架编写的服务器有几个基本的元素:react
应用程序对象(application):管理应用程序资源的对象,一个应用程序能够管理多个service对象。linux
服务(service),服务对象启动监听的端口,服务器
协议工厂(factory):当客户端链接到服务器时,用来建立协议对象。网络
协议(protocol):每一个协议对象对应一个网络链接。协议类处理网络协议(如http,ftp,自定义协议等)app
twisted 框架内部运行依赖的元素:框架
reactor:异步事件的主要循环处理类,负责监控事件,调用注册的回调函数提供服务。(在linux上主要使用epoll/select来实现)ssh
defer: 异步回调序列,当序列被执行的时候,顺序执行注册的回调函数。异步
实现一个 echo server,建立文件 echoServ.py函数
#!/usr/bin/env python # coding: utf-8 from twisted.internet.protocol import Protocol from twisted.internet.protocol import Factory from twisted.internet.endpoints import TCP4ServerEndpoint from twisted.internet import reactor class Echo(Protocol): '''协议类实现用户的服务协议,例如 http,ftp,ssh 等''' def __init__(self, factory): self.factory = factory def connectionMade(self): '''链接创建时被回调的方法''' self.factory.numProtocols = self.factory.numProtocols + 1 self.transport.write("Welcome! There are currently %d open connections.\n" % (self.factory.numProtocols,)) def connectionLost(self, reason): '''链接关闭时被回调的方法''' self.factory.numProtocols = self.factory.numProtocols - 1 def dataReceived(self, data): '''接收数据的函数,当有数据到达时被回调''' self.transport.write(data) class EchoFactory(Factory): '''协议工厂类,当客户端创建链接的时候,建立协议对象,协议对象与客户端链接一一对应''' numProtocols = 0 def buildProtocol(self, addr): return Echo(self) if __name__ == '__main__': # 建立监听端口 reactor.listenTCP(8007, EchoFactory()) # 开始监听事件 reactor.run()
运行服务程序
python echoServ.py
测试服务程序
telnet 127.0.0.1 8007
协议类继承自 twisted.internet.protocol.Protocol,需实现 dataReceived 等方法。在协议类中实现应用协议。
协议工厂继承自 twisted.internet.protocol.Factory,需实现 buildProtocol 方法。协议工厂负责实例化协议类,不该该保存于链接相关的状态信息。
使用守护进程的方式运行服务,须要提供一个 tac 配置文件(这就是一个 python 文件,只是扩展名不一样),而且在这个文件中须要建立一个应用程序对象,对象名必须是 application。
建立一个 echo.tac 文件
#!/usr/bin/env python # coding: utf-8 from twisted.application import service, internet from echoServ import EchoFactory # 建立应用程序对象 application = service.Application('Echo 服务程序') # 建立 service 对象 myServices = internet.TCPServer(8007, EchoFactory()) # 设置 application 为 service 的父元素 myservices.setServiceParent(application)
用守护进程方式运行服务
twistd -y echo.tac
中止服务
kill -15 pid
上面就是 twisted 网络框架编写服务的基本方法,在框架内部有丰富的协议工厂,协议,但是很方便的实现简单的 http,ftp,ssh 等服务器程序。
后面我会介绍一些经常使用的功能的实现原理,例如:如何记录日志,客户端 http 异步请求的处理,defer 运行原理等。