Python的Tornado之WebSocket的概念以及應用介紹

不言
發布: 2018-10-20 15:35:10
轉載
2269 人瀏覽過
這篇文章帶給大家的內容是關於Python的Tornado之WebSocket概念及應用介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

Tornado的非同步特性使得其非常適合伺服器的高並發處理,客戶端與伺服器的持久連接應用框架就是高並發的典型應用。而WebSocket正是在HTTP客戶端與伺服器之間建立持久連線的HTML5標準技術。本章將說明WebSocket技術在Tornado框架中的應用。
WebSocket protocol是HTML5定義的一種新的標準協定(RFC6455),它實作了瀏覽器與伺服器的雙全工通訊(full-duplex)。

1、WebSocket的應用程式場景

傳統的HTTP和HTML技術使用用戶端主動向伺服器發送請求並取得回應。但是隨著即時通訊需求的增多,這樣的通訊模式有時並不能滿足應用的需求。

WebSocket與普通的Socket通訊類似,它打破了原來HTTP的Request和Response一對一的通訊模型,同時打破了伺服器只能被動地接受客戶端請求的應用場景。也許讀者聽過Ajax、Long poll等基於傳統HTTP的動態用戶端技術,但這些技術無不採用輪詢技術,耗費了大量的網路頻寬和運算資源。

而WebSocket正是為了應對這樣的場景而製定的HTML5標準,相對於普通的Socket通信,WebSocket又在應用層定義了基本的交互流程,使得Tornado這樣的伺服器框架和JavaScript客戶端可以建構出標準的WebSocket模組。

總結WebSocket的特點如下:

  • WebSocket適合服務端主動推送的場景。

  • 相對於Ajax和Long poll等技術,WebSocket通訊模型更有效率。

  • WebSocket仍然與HTTP完成Internet通訊。

  • 因為是HTML5的標準協議,所以不受企業防火牆的攔截。

2、WebSocket的通訊原理

WebSocket的通訊原理是在客戶端與伺服器之間建立TCP持久鏈接,從而使得當伺服器有訊息需要推送給客戶端時能夠進行即時通訊。

雖然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請求方式:GET

  • #請求位址:/stock_info

  • HTTP版本編號: 1.1

  • 伺服器主機網域:echo.websocket.org

  • Cookie資訊:__token=ubcxx13

#但是在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持久鏈接,雙發已經可以隨時向對方發送訊息。

以上是Python的Tornado之WebSocket的概念以及應用介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!