Twisted 簡介

来源:http://www.cnblogs.com/misswangxing/archive/2017/10/22/7712318.html
-Advertisement-
Play Games

Twisted是用Python實現的基於事件驅動的網路引擎框架,Twisted支持許多常見的傳輸及應用層協議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一樣,Twisted也具有“內置電池”(batteries-included)的特點。Twi ...


Twisted是用Python實現的基於事件驅動的網路引擎框架,Twisted支持許多常見的傳輸及應用層協議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一樣,Twisted也具有“內置電池”(batteries-included)的特點。Twisted對於其支持的所有協議都帶有客戶端和伺服器實現,同時附帶有基於命令行的工具,使得配置和部署產品級的Twisted應用變得非常方便。

Transports
Transports代表網路中兩個通信結點之間的連接。Transports負責描述連接的細節,比如連接是面向流式的還是面向數據報的,流控以及可靠性。TCP、UDP和Unix套接字可作為transports的例子。它們被設計為“滿足最小功能單元,同時具有最大程度的可復用性”,而且從協議實現中分離出來,這讓許多協議可以採用相同類型的傳輸。Transports實現了ITransports介面,它包含如下的方法:

write 以非阻塞的方式按順序依次將數據寫到物理連接上
writeSequence 將一個字元串列表寫到物理連接上
loseConnection 將所有掛起的數據寫入,然後關閉連接
getPeer 取得連接中對端的地址信息
getHost 取得連接中本端的地址信息
將transports從協議中分離出來也使得對這兩個層次的測試變得更加簡單。可以通過簡單地寫入一個字元串來模擬傳輸,用這種方式來檢查。

Protocols
Protocols描述瞭如何以非同步的方式處理網路中的事件。HTTP、DNS以及IMAP是應用層協議中的例子。Protocols實現了IProtocol介面,它包含如下的方法:

makeConnection 在transport對象和伺服器之間建立一條連接
connectionMade 連接建立起來後調用
dataReceived 接收數據時調用
connectionLost 關閉連接時調用

Reactor模式
Twisted實現了設計模式中的反應堆(reactor)模式,這種模式在單線程環境中調度多個事件源產生的事件到它們各自的事件處理常式中去。

Twisted的核心就是reactor事件迴圈。Reactor可以感知網路、文件系統以及定時器事件。它等待然後處理這些事件,從特定於平臺的行為中抽象出來,並提供統一的介面,使得在網路協議棧的任何位置對事件做出響應都變得簡單。


Deferreds
Deferred對象以抽象化的方式表達了一種思想,即結果還尚不存在。它同樣能夠幫助管理產生這個結果所需要的回調鏈。當從函數中返回時,Deferred對象承諾在某個時刻函數將產生一個結果。返回的Deferred對象中包含所有註冊到事件上的回調引用,因此在函數間只需要傳遞這一個對象即可,跟蹤這個對象比單獨管理所有的回調要簡單的多。

Deferred對象包含一對回調鏈,一個是針對操作成功的回調,一個是針對操作失敗的回調。初始狀態下Deferred對象的兩條鏈都為空。在事件處理的過程中,每個階段都為其添加處理成功的回調和處理失敗的回調。當一個非同步結果到來時,Deferred對象就被“激活”,那麼處理成功的回調和處理失敗的回調就可以以合適的方式按照它們添加進來的順序依次得到調用。

非同步版URL獲取器採用Deferred對象後的代碼如下:

from twisted.internet import reactor
import getPage

def processPage(page):
print page

def logError(error):
print error

def finishProcessing(value):
print "Shutting down..."
reactor.stop()

url = "http://google.com"
deferred = getPage(url) # getPage returns a Deferred
deferred.addCallbacks(success, failure)
deferred.addBoth(stop)

reactor.run()
在這個版本中調用的事件處理函數與之前相同,但它們都註冊到了一個單獨的Deferred對象上,而不是分散在代碼各處再以參數形式傳遞給getPage。

例子1:(簡單的tcp伺服器實現)
server.py
#-*-coding:utf-8-*-

from twisted.internet import protocol,reactor
#from twisted.protocols.basic import LineReceiver
from time import ctime
import os,sys
from twisted.python import log #導入log

PORT = 23233

class TSServerProtocol(protocol.Protocol): #從Protocol派生出的TSSserverProtocol類
def connectionMade(self): #因為繼承了Protocol就可以使用和自定義父類的方法了
clnt = self.clnt = self.transport.getPeer().host
log.msg('Client connected from %s' % clnt) #log用法
#self.sendData()
def dataReceived(self, data): #接受數據的方法
addr = self.transport.getHost().host
if data:
log.msg('Cmd received from %s : %s' % (self.clnt,data)) #data接收到的信息
self.transport.write('這是來自 %s ,的答覆:%s' %(addr,ctime())) #write發送
'''for i in os.listdir(os.getcwd()):
self.transport.write('[%s]%s' %(i,data))'''
def connectionLost(self,reason): #reason參數必須要寫不然報錯,當連接斷開時的調用
log.msg('連接斷開. ')
#log.msg('連接斷開. %s' % reason) # 加上reason會把斷開的錯誤信息答應出來

factory =protocol.Factory() #因為我們上面只導入了protocol,所以這要把Factory函數導進來,每一個protocol的實例都有一個工廠的引用,使用self.factory可以訪問所在的工廠實例
factory.protocol = TSServerProtocol #當有請求進來時調用TSServerProtocol類
print 'waiting for connection......'

log.startLogging(sys.stdout) #以日誌形式列印到視窗
reactor.listenTCP(PORT,factory) #監聽請求
reactor.run() #啟動迴圈

client.py
#-*-coding:utf-8

from twisted.internet import protocol,reactor

HOST = 'localhost' #要連接的IP地址
PORT = 23233 #埠
class TSClntProtocol(protocol.Protocol): #同服務端一樣
def sendData(self): #定義一個發送數據的方法
data = raw_input('>')
if data:
print '....sending %s.......' %data
self.transport.write(data) #發送數據
else:
self.transport.loseConnection() #當沒有輸入時斷開連接
def connectionMade(self):
self.sendData() #調用方法
def dataReceived(self, data):
print data
self.sendData()

class TSClntFactory(protocol.ClientFactory):#我的理解是客戶端寫protocol.ClientFactory,服務端寫protocol.Factory
protocol = TSClntProtocol #同服務端一樣
clientConnectionLost = clientConnectionFailed = lambda self,connector,reason:reactor.stop()

reactor.connectTCP(HOST,PORT,TSClntFactory()) #跟服務端一樣
reactor.run()


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本內容有版許可權制,僅提供學習交流參考等等,請勿隨便轉載或者代碼商用。 1 /** layui-v2.1.5 MIT License By http://www.layui.com */; 2 layui.define(["layer", "laytpl", "upload"], function ( ...
  • 這是一個神奇的組件,通過名字我們可以看出來,這個組件的功能就是把model和form組合起來,對,你沒猜錯,相信自己的英語水平。 先來一個簡單的例子來看一下這個東西怎麼用: 比如我們的資料庫中有這樣一張學生表,欄位有姓名,年齡,愛好,郵箱,電話,住址,註冊時間等等一大堆信息,現在讓你寫一個創建學生的 ...
  • 線程 線程和進程 進程 : 進程指正在運行的程式。確切的來說,當一個程式進入記憶體運行,即變成一個進程,進程是處於運行過程中的程式,並且具有一定獨立功能。 線程 : 線程是進程中的一個執行單元(執行路徑),負責當前進程中程式的執行,一個進程中至少有一個線程。一個進程中是可以有多個線程的,這個應用程式也 ...
  • 上篇主要介紹了jQuery,和一些基本用法,這篇主要講解動畫、常用事件、還有一些jQuery的補充內容。 ...
  • 學習爬蟲有一段時間了,今天使用Scrapy框架將校花網的圖片爬取到本地。Scrapy爬蟲框架相對於使用requests庫進行網頁的爬取,擁有更高的性能。 Scrapy官方定義:Scrapy是用於抓取網站並提取結構化數據的應用程式框架,可用於廣泛的有用應用程式,如數據挖掘,信息處理或歷史存檔。 建立S ...
  • Git忽略規則: 在git中如果想忽略掉某個文件,不讓這個文件提交到版本庫中,可以使用修改根目錄中 .gitignore 文件的方法(如果沒有這個文件,則需自己手工建立此文件)。這個文件每一行保存了一個匹配的規則例如: # 此為註釋 – 將被 Git 忽略*.sample # 忽略所有 .sampl ...
  • 1、取絕對值函數:abs() 。 2、比較函數: cmp(x, y) ,需要兩個參數,如果 x<y,返回 -1,如果 x==y,返回 0,如果 x>y,返回 1。 3、int()函數可以把其他數據類型轉換為整數。 4、str()函數把其他類型轉換成 str。 ...
  • 關於目後佐道IT教育 http://www.cnblogs.com/itpua/p/7710917.html 目後佐道IT教育的師資團隊 http://www.cnblogs.com/itpua/p/7712077.html 目後佐道IT教育正在打架報名中,歡迎高中生、大學生前來學習編程技術,招生面 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...