python學習筆記--web即時通訊

weixin_34054866發表於2017-11-04

所謂 Web 即時通訊,就是說我們可以通過一種機制在網頁上立即通知使用者一件事情的發生,是不需要使用者重新整理網頁的。Web 即時通訊的用途有很多,比如實時聊天,即時推送等。如當我們在登陸瀏覽知乎時如果有人回答了我們的問題,知乎就會即時提醒我們,再比如現在電子商務的線上客服功能。這些能大大提高使用者體驗的功能都是基於 Web 即時通訊實現的。

普通 HTTP流程

客戶端從伺服器端請求網頁

伺服器作出相應的反應

伺服器返回相應到客戶端

5186857-3e1b223c9c3f3919.png

而由於 HTTP 請求是無狀態的,也就是說每次請求完成後,HTTP 連結就斷開了,伺服器和瀏覽器互相之間是完全不可知的,只有下一次再發起一次請求才能更新相應的資訊。談到這裡我們就不難想到,我們可以簡單的讓瀏覽器每隔一個週期就發起一次請求,這樣就能在一定程度上模擬實時效果了,這也就是輪詢,術語叫做Polling。

Polling流程

客戶端使用普通的 http 方式向伺服器端請求網頁

客戶端執行網頁中的 JavaScript 輪詢指令碼,定期迴圈的向伺服器傳送請求(例如每 5 秒傳送一次請求),獲取資訊

伺服器對每次請求作出響應,並返回相應資訊,就像正常的 http 請求一樣

5186857-acdc5771d0ba1241.png

通過輪訓的方式我們就可以相對即時的獲取資訊。但是由於輪訓的原理是使瀏覽器頻繁的向伺服器發起請求,這在一定程度上會造成效能效率問題。為了優化這些效能問題,人們又想到了一種方法。那就是在伺服器接收到請求的時候不理解返回,而是隻有當有資料變化(或者超時)的時候才返回。這樣一來,我們就可以利用一次請求最大可能的保持連線的有效性,大大的減少了Polling中的請求次數。這個方法叫做長輪詢,也叫做Long-Polling。

Long-Polling流程

客戶端使用普通的 http 方式向伺服器端請求網頁

客戶端執行網頁中的 JavaScript 指令碼,向伺服器傳送資料、請求資訊

伺服器並不是立即就對客戶端的請求作出響應,而是等待有效的更新

當資訊是有效的更新時,伺服器才會把資料推送給客戶端

當客戶端接收到伺服器的通知時,立即會傳送一個新的請求,進入到下一次的輪詢

5186857-ce7e847858a81651.png

以上方法是實現 Web 實時通訊的常用方法。當然在 HTML5 出來之後,我們就有更好的選擇啦。在 HTML5 中,我們可以使用SSE或者是WebSocket。SSE的全稱是Server Send Event,聽名字就很好理解啦。也就是由伺服器來推送資料。看到這裡是不是興奮呢?其實很多情況下,我們只需要這種簡單的功能:由伺服器推送資料到瀏覽器。比如推送比賽資訊、股價的變化等等。

Server Send Event流程

客戶端使用普通的 http 方式向伺服器端請求網頁

客戶端執行網頁中的 JavaScript 指令碼,與伺服器之間建立了一個連線

當伺服器端有更新時,會傳送一個事件到客戶端

5186857-a60d688025c7cbfd.png

如果SSE還不能滿足我們的需求的話,我們完全就可以使用WebSocket啦。當使用WebSocket時,瀏覽器和伺服器之間就建立了一個全雙工通道,互相都可以傳送訊息,完全的做到了及時,就像使用tcp socket一樣。

SSE和WebSocket的簡單對比:

WebSocket 是全雙工通道,可以雙向通訊,功能更強;SSE 是單向通道,只能伺服器向瀏覽器端傳送。

WebSocket 是一個新的協議,需要伺服器端支援;SSE 則是部署在 HTTP 協議之上的,現有伺服器軟體都支援。

SSE 是一個輕量級協議,相對簡單;WebSocket 是一種較重的協議,相對複雜。

到這裡我們就基本瞭解了一些事先 Web 實時通訊的機制,下一節中,我們將使用SSE實現一個簡單的線上聊天室。

相關文章