摘要:本文對過去和現在流行的實時推送技術進行了比較與總結。以上我們介紹了三種實時推送技術,然而各自的缺點很明顯,使用起來并不理想,接下來我們著重介紹另一種技術它是比較理想的雙向通信技術。
前言
隨著 Web 的發展,用戶對于 Web 的實時推送要求也越來越高 ,比如,工業運行監控、Web 在線通訊、即時報價系統、在線游戲等,都需要將后臺發生的變化主動地、實時地傳送到瀏覽器端,而不需要用戶手動地刷新頁面。本文對過去和現在流行的 Web 實時推送技術進行了比較與總結。
本文完整的源代碼請猛戳Github博客,紙上得來終覺淺,建議大家動手敲敲代碼。
一、雙向通信HTTP 協議有一個缺陷:通信只能由客戶端發起。舉例來說,我們想了解今天的天氣,只能是客戶端向服務器發出請求,服務器返回查詢結果。HTTP 協議做不到服務器主動向客戶端推送信息。這種單向請求的特點,注定了如果服務器有連續的狀態變化,客戶端要獲知就非常麻煩。在WebSocket協議之前,有三種實現雙向通信的方式:輪詢(polling)、長輪詢(long-polling)和iframe流(streaming)。
1.輪詢(polling)
輪詢是客戶端和服務器之間會一直進行連接,每隔一段時間就詢問一次。其缺點也很明顯:連接數會很多,一個接受,一個發送。而且每次發送請求都會有Http的Header,會很耗流量,也會消耗CPU的利用率。
優點:實現簡單,無需做過多的更改
缺點:輪詢的間隔過長,會導致用戶不能及時接收到更新的數據;輪詢的間隔過短,會導致查詢請求過多,增加服務器端的負擔
// 1.html
//輪詢 服務端 let express = require("express"); let app = express(); app.use(express.static(__dirname)); app.get("/clock",function(req,res){ res.end(new Date().toLocaleString()); }); app.listen(8080);
啟動本地服務,打開http://localhost:8080/1.html,得到如下結果:
2.長輪詢(long-polling)
長輪詢是對輪詢的改進版,客戶端發送HTTP給服務器之后,看有沒有新消息,如果沒有新消息,就一直等待。當有新消息的時候,才會返回給客戶端。在某種程度上減小了網絡帶寬和CPU利用率等問題。由于http數據包的頭部數據量往往很大(通常有400多個字節),但是真正被服務器需要的數據卻很少(有時只有10個字節左右),這樣的數據包在網絡上周期性的傳輸,難免對網絡帶寬是一種浪費。
優點:比 Polling 做了優化,有較好的時效性
缺點:保持連接會消耗資源; 服務器沒有返回有效數據,程序超時。
// 2.html 服務端代碼同上3.iframe流(streaming)
iframe流方式是在頁面中插入一個隱藏的iframe,利用其src屬性在服務器和客戶端之間創建一條長連接,服務器向iframe傳輸數據(通常是HTML,內有負責插入信息的javascript),來實時更新頁面。
優點:消息能夠實時到達;瀏覽器兼容好
缺點:服務器維護一個長連接會增加開銷;IE、chrome、Firefox會顯示加載沒有完成,圖標會不停旋轉。
// 3.html
//iframe流 let express = require("express") let app = express() app.use(express.static(__dirname)) app.get("/clock", function(req, res) { setInterval(function() { let date = new Date().toLocaleString() res.write(` `) }, 1000) }) app.listen(8080)
啟動本地服務,打開http://localhost:8080/3.html,得到如下結果:
上述代碼中,客戶端只請求一次,然而服務端卻是源源不斷向客戶端發送數據,這樣服務器維護一個長連接會增加開銷。
以上我們介紹了三種實時推送技術,然而各自的缺點很明顯,使用起來并不理想,接下來我們著重介紹另一種技術--websocket,它是比較理想的雙向通信技術。
二、WebSocket 1.什么是websocketWebSocket是一種全新的協議,隨著HTML5草案的不斷完善,越來越多的現代瀏覽器開始全面支持WebSocket技術了,它將TCP的Socket(套接字)應用在了webpage上,從而使通信雙方建立起一個保持在活動狀態連接通道。
一旦Web服務器與客戶端之間建立起WebSocket協議的通信連接,之后所有的通信都依靠這個專用協議進行。通信過程中可互相發送JSON、XML、HTML或圖片等任意格式的數據。由于是建立在HTTP基礎上的協議,因此連接的發起方仍是客戶端,而一旦確立WebSocket通信連接,不論服務器還是客戶端,任意一方都可直接向對方發送報文。
初次接觸 WebSocket 的人,都會問同樣的問題:我們已經有了 HTTP 協議,為什么還需要另一個協議?
2.HTTP的局限性HTTP是半雙工協議,也就是說,在同一時刻數據只能單向流動,客戶端向服務器發送請求(單向的),然后服務器響應請求(單向的)。
服務器不能主動推送數據給瀏覽器。這就會導致一些高級功能難以實現,諸如聊天室場景就沒法實現。
3.WebSocket的特點支持雙向通信,實時性更強
可以發送文本,也可以發送二進制數據
減少通信量:只要建立起WebSocket連接,就希望一直保持連接狀態。和HTTP相比,不但每次連接時的總開銷減少,而且由于WebSocket的首部信息很小,通信量也相應減少了
相對于傳統的HTTP每次請求-應答都需要客戶端與服務端建立連接的模式,WebSocket是類似Socket的TCP長連接的通訊模式,一旦WebSocket連接建立后,后續數據都以幀序列的形式傳輸。在客戶端斷開WebSocket連接或Server端斷掉連接前,不需要客戶端和服務端重新發起連接請求。在海量并發和客戶端與服務器交互負載流量大的情況下,極大的節省了網絡帶寬資源的消耗,有明顯的性能優勢,且客戶端發送和接受消息是在同一個持久連接上發起,實時性優勢明顯。
接下來我看下websocket如何實現客戶端與服務端雙向通信:
// websocket.html
// websocket.js let express = require("express") let app = express() app.use(express.static(__dirname)) //http服務器 app.listen(3000) let WebSocketServer = require("ws").Server //用ws模塊啟動一個websocket服務器,監聽了9999端口 let wsServer = new WebSocketServer({ port: 9999 }) //監聽客戶端的連接請求 當客戶端連接服務器的時候,就會觸發connection事件 //socket代表一個客戶端,不是所有客戶端共享的,而是每個客戶端都有一個socket wsServer.on("connection", function(socket) { //每一個socket都有一個唯一的ID屬性 console.log(socket) console.log("客戶端連接成功") //監聽對方發過來的消息 socket.on("message", function(message) { console.log("接收到客戶端的消息", message) socket.send("服務器回應:" + message) }) })
啟動本地服務,打開http://localhost:3000/websocket.html,得到如下結果:
方式 | 類型 | 技術實現 | 優點 | 缺點 | 適用場景 |
---|---|---|---|---|---|
輪詢Polling | client→server | 客戶端循環請求 | 1、實現簡單 2、 支持跨域 | 1、浪費帶寬和服務器資源 2、 一次請求信息大半是無用(完整http頭信息) 3、有延遲 4、大部分無效請求 | 適于小型應用 |
長輪詢Long-Polling | client→server | 服務器hold住連接,一直到有數據或者超時才返回,減少重復請求次數 | 1、實現簡單 2、不會頻繁發請求 3、節省流量 4、延遲低 | 1、服務器hold住連接,會消耗資源 2、一次請求信息大半是無用 | WebQQ、Hi網頁版、Facebook IM |
長連接iframe | client→server | 在頁面里嵌入一個隱蔵iframe,將這個 iframe 的 src 屬性設為對一個長連接的請求,服務器端就能源源不斷地往客戶端輸入數據。 | 1、數據實時送達 2、不發無用請求,一次鏈接,多次“推送” | 1、服務器增加開銷 2、無法準確知道連接狀態 3、IE、chrome等一直會處于loading狀態 | Gmail聊天 |
WebSocket | server?client | new WebSocket() | 1、支持雙向通信,實時性更強 2、可發送二進制文件3、減少通信量 | 1、瀏覽器支持程度不一致 2、不支持斷開重連 | 網絡游戲、銀行交互和支付 |
綜上所述:Websocket協議不僅解決了HTTP協議中服務端的被動性,即通信只能由客戶端發起,也解決了數據同步有延遲的問題,同時還帶來了明顯的性能優勢,所以websocket
是Web 實時推送技術的比較理想的方案,但如果要兼容低版本瀏覽器,可以考慮用輪詢來實現。
給大家推薦一個好用的BUG監控工具Fundebug,歡迎免費試用!
歡迎關注公眾號:前端工匠,你的成長我們一起見證!如果你感覺有收獲,歡迎給我打賞,以激勵我更多輸出優質開源內容
參考文章WebSocket 教程
珠峰前端架構課
Web 實時推送技術的總結
WebSocket(1): 服務端“實時推送”的演變
長連接/websocket/SSE等主流服務器推送技術比較
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102507.html
摘要:解決問題即時通信要解決三方面的問題雙全工通信低延時支持跨域各種即時通信技術輪詢客戶端定時向服務器發送請求,服務器接到請求后馬上返回響應信息并關閉連接。優點實現真正的即時通信,而不是偽即時。 解決問題 即時通信要解決三方面的問題: 雙全工通信 低延時 支持跨域 各種即時通信技術 輪詢 客戶端定時向服務器發送Ajax請求,服務器接到請求后馬上返回響應信息并關閉連接。優點:后端程序編寫比...
摘要:輪詢通過輪詢,瀏覽器定期發送請求并立即接收響應這項技術是瀏覽器首次嘗試傳遞實時信息。該協議由兩層組成記錄協議和握手協議。安全套接層及其繼任者傳輸層安全,是為網絡通信提供安全及數據完整性的一種安全協議。移除了開銷大幅度減輕了復雜度。 Web Sockets定義了一種在通過一個單一的 socket 在網絡上進行全雙工通訊的通道。它不僅僅是傳統的 HTTP 通訊的一個增量的提高,尤其對于實時...
摘要:現在已經成為的官方標準,如,以及的擴展協議。作者簡介李會軍,聯合創始人,關注團隊協作領域,致力于用工具解決中小團隊的協作問題。 Worktile自上線兩年多以來,以良好的用戶體驗和穩定的服務,獲得了用戶的認可和喜愛。截止筆者寫這篇文章的時候,已經有超過10萬家團隊在使用Worktile。作為團隊協作工具,從技術上分析首先要解決如下幾個問題: 基于Web的跨平臺設計,讓用戶在任何地方都...
閱讀 1184·2023-04-26 00:34
閱讀 3357·2023-04-25 16:47
閱讀 2120·2021-11-24 11:14
閱讀 3106·2021-09-26 09:55
閱讀 3718·2019-08-30 15:56
閱讀 3217·2019-08-29 16:57
閱讀 1911·2019-08-26 13:38
閱讀 2669·2019-08-26 12:22