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 運行原理等。