所謂 Web 即時通信斟珊,就是說我們可以通過一種機制在網(wǎng)頁上立即通知用戶一件事情的發(fā)生,是不需要用戶刷新網(wǎng)頁的富纸。Web 即時通信的用途有很多囤踩,比如實時聊天,即時推送等晓褪。如當我們在登陸瀏覽知乎時如果有人回答了我們的問題堵漱,知乎就會即時提醒我們,再比如現(xiàn)在電子商務的在線客服功能涣仿。這些能大大提高用戶體驗的功能都是基于 Web 即時通信實現(xiàn)的勤庐。
普通 HTTP流程
客戶端從服務器端請求網(wǎng)頁
服務器作出相應的反應
服務器返回相應到客戶端
而由于 HTTP 請求是無狀態(tài)的,也就是說每次請求完成后好港,HTTP 鏈接就斷開了愉镰,服務器和瀏覽器互相之間是完全不可知的,只有下一次再發(fā)起一次請求才能更新相應的信息钧汹。談到這里我們就不難想到丈探,我們可以簡單的讓瀏覽器每隔一個周期就發(fā)起一次請求,這樣就能在一定程度上模擬實時效果了拔莱,這也就是輪詢碗降,術語叫做Polling隘竭。
Polling流程
客戶端使用普通的 http 方式向服務器端請求網(wǎng)頁
客戶端執(zhí)行網(wǎng)頁中的 JavaScript 輪詢腳本,定期循環(huán)的向服務器發(fā)送請求(例如每 5 秒發(fā)送一次請求)遗锣,獲取信息
服務器對每次請求作出響應货裹,并返回相應信息,就像正常的 http 請求一樣
通過輪訓的方式我們就可以相對即時的獲取信息精偿。但是由于輪訓的原理是使瀏覽器頻繁的向服務器發(fā)起請求弧圆,這在一定程度上會造成性能效率問題。為了優(yōu)化這些性能問題笔咽,人們又想到了一種方法搔预。那就是在服務器接收到請求的時候不理解返回,而是只有當有數(shù)據(jù)變化(或者超時)的時候才返回叶组。這樣一來拯田,我們就可以利用一次請求最大可能的保持連接的有效性,大大的減少了Polling中的請求次數(shù)甩十。這個方法叫做長輪詢船庇,也叫做Long-Polling。
Long-Polling流程
客戶端使用普通的 http 方式向服務器端請求網(wǎng)頁
客戶端執(zhí)行網(wǎng)頁中的 JavaScript 腳本侣监,向服務器發(fā)送數(shù)據(jù)鸭轮、請求信息
服務器并不是立即就對客戶端的請求作出響應,而是等待有效的更新
當信息是有效的更新時橄霉,服務器才會把數(shù)據(jù)推送給客戶端
當客戶端接收到服務器的通知時窃爷,立即會發(fā)送一個新的請求,進入到下一次的輪詢
以上方法是實現(xiàn) Web 實時通信的常用方法姓蜂。當然在 HTML5 出來之后按厘,我們就有更好的選擇啦。在 HTML5 中钱慢,我們可以使用SSE或者是WebSocket逮京。SSE的全稱是Server Send Event,聽名字就很好理解啦束莫。也就是由服務器來推送數(shù)據(jù)造虏。看到這里是不是興奮呢麦箍?其實很多情況下,我們只需要這種簡單的功能:由服務器推送數(shù)據(jù)到瀏覽器陶珠。比如推送比賽信息挟裂、股價的變化等等。
Server Send Event流程
客戶端使用普通的 http 方式向服務器端請求網(wǎng)頁
客戶端執(zhí)行網(wǎng)頁中的 JavaScript 腳本揍诽,與服務器之間建立了一個連接
當服務器端有更新時诀蓉,會發(fā)送一個事件到客戶端
如果SSE還不能滿足我們的需求的話栗竖,我們完全就可以使用WebSocket啦。當使用WebSocket時渠啤,瀏覽器和服務器之間就建立了一個全雙工通道狐肢,互相都可以發(fā)送消息,完全的做到了及時沥曹,就像使用tcp socket一樣份名。
SSE和WebSocket的簡單對比:
WebSocket 是全雙工通道,可以雙向通信妓美,功能更強僵腺;SSE 是單向通道,只能服務器向瀏覽器端發(fā)送壶栋。
WebSocket 是一個新的協(xié)議辰如,需要服務器端支持;SSE 則是部署在 HTTP 協(xié)議之上的贵试,現(xiàn)有服務器軟件都支持琉兜。
SSE 是一個輕量級協(xié)議,相對簡單毙玻;WebSocket 是一種較重的協(xié)議豌蟋,相對復雜。
到這里我們就基本了解了一些事先 Web 實時通信的機制淆珊,下一節(jié)中夺饲,我們將使用SSE實現(xiàn)一個簡單的在線聊天室。