上一篇文章: Python:Tornado 第二章:實戰演練:開發Tornado網站:第九節:防止跨站攻擊
下一篇文章: Python:Tornado 第三章:HTML5 WebSocket概念及應用:第二節:服務端編程
Tornado的異步特性使得其很是適合服務器的高併發處理,客戶端與服務器的持久鏈接應用框架就是高併發的典型應用。而WebSocket正是在HTTP客戶端與服務器之間創建持久鏈接的HTML5標準技術。本章將講解WebSocket技術在Tornado框架中的應用。
WebSocket protocol是HTML5定義的一種新的標準協議(RFC6455),它實現了瀏覽器與服務器的雙全工通訊(full-duplex)。web
傳統的HTTP和HTML技術使用客戶端主動向服務器發送請求並獲取回覆。可是隨着即時通信需求的增多,這樣的通訊模式有時並不能知足應用的需求。編程
WebSocket與普通的Socket通信相似,它打破了原來HTTP的Request和Response一對一的通訊模型,同時打破了服務器只能被動地接受客戶端請求的應用場景。也許讀者據說過Ajax、Long poll等基於傳統HTTP的動態客戶端技術,但這些技術無不採用輪詢技術,耗費了大量的網絡帶寬和計算資源。segmentfault
而WebSocket正是爲了應對這樣的場景而制定的HTML5標準,相對於普通的Socket通訊,WebSocket又在應用層定義了基本的交互流程,使得Tornado這樣的服務器框架和JavaScript客戶端能夠構建出標準的WebSocket模塊。瀏覽器
總結WebSocket的特色以下:服務器
WebSocket的通訊原理是在客戶端與服務器之間創建TCP持久連接,從而使得當服務器有消息須要推送給客戶端時可以進行即時通訊。websocket
雖然WebSocket不是HTTP,但因爲在Internet上HTML本事是由HTTP封裝並進行傳輸的,因此WebSocket仍然須要與HTTP進行協做。IETF在RFC6455中定義了基於HTTP鏈路創建WebSocket信道的標準流程。網絡
客戶端經過發送以下HTTP Request告訴服務器須要創建一個WebSocket長連接信道:併發
GET /stock_info/?encoding=text HTTP/1.1 Host:echo.websocket.org Origin:http://websocket.org Cookie:__token=ubcxx13 Connection:Upgrade Sec-WebSocket-Key:uRovscZjNol/umbTt5uKmw== Upgrade:websocket Sec-WebSocket-Version:13
讀者能夠發現其仍然是一個HTTP Request包,並對其中的內容很是熟悉。框架
可是在HTTP Header中出現了4個特點的字段,他們是:異步
Connection:Upgrade Sec-WebSocket-Key:uRovscZjNol/umbTt5uKmw== Upgrade:websocket Sec-WebSocket-Version:13
這就是WebSocket創建鏈路的核心,它告訴Web服務器:客戶端但願創建一個WebSocket連接,客戶端使用的WebSocket版本時13,密鑰是uRovscZjNol/umbTt5uKmw==。
服務器在收到該Request後,若是贊成創建WebSocket連接則返回相似以下的Response:
HTTP/1.1 101 WebSocket Protocol Handshake Date:Fri,10 Feb 2012 17:38:18 GMT Connection:Upgrade Server:Kaazing Gateway Upgrade:WebSocket Access-Control-Allow-Origin:http://websocket.org Access-Contril-Allow-Credentials:true Sec-WebSocket-Accept:rLHCKw/SKs09GAH/ZSFhBATDKrU= Access-Control-Allow-Headers:content-type
這依舊是一個標準的HTTP Response,其中與WebSocket相關的Header信息是:
Connection:Upgrade Upgrade:WebSocket Sec-WebSocket-Accept:rLHCKw/SKs09GAH/ZSFhBATDKrU=
前面的兩條數據告訴客戶端:服務器已經將本鏈接轉換爲WebSocket連接。而Sec-WebSocket-Accept是將客服端發送的Sec-WebSocket-Key加密後產生的數據,以讓客服端確認服務器可以正常工做。
至此,在客戶端與服務器之間已經創建了一個TCP持久連接,雙發已經能夠隨時向對方發送消息。