成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談Web 實時推送技術,有對比,有總結

新聞 前端
隨著 Web 的發展,用戶對于 Web 的實時推送要求也越來越高。本文對過去和現在流行的 Web 實時推送技術進行了比較與總結。

前言

隨著 Web 的發展,用戶對于 Web 的實時推送要求也越來越高 ,比如,工業運行監控、Web 在線通訊、即時報價系統、在線游戲等,都需要將后臺發生的變化主動地、實時地傳送到瀏覽器端,而不需要用戶手動地刷新頁面。本文對過去和現在流行的 Web 實時推送技術進行了比較與總結。

一、雙向通信

HTTP 協議有一個缺陷:通信只能由客戶端發起。舉例來說,我們想了解今天的天氣,只能是客戶端向服務器發出請求,服務器返回查詢結果。HTTP 協議做不到服務器主動向客戶端推送信息。這種單向請求的特點,注定了如果服務器有連續的狀態變化,客戶端要獲知就非常麻煩。在WebSocket協議之前,有三種實現雙向通信的方式:輪詢(polling)、長輪詢(long-polling)和iframe流(streaming)

1.輪詢(polling)

淺談Web 實時推送技術,有對比,有總結

輪詢是客戶端和服務器之間會一直進行連接,每隔一段時間就詢問一次。其缺點也很明顯:連接數會很多,一個接受,一個發送。而且每次發送請求都會有Http的Header,會很耗流量,也會消耗CPU的利用率

  • 優點:實現簡單,無需做過多的更改
  • 缺點:輪詢的間隔過長,會導致用戶不能及時接收到更新的數據;輪詢的間隔過短,會導致查詢請求過多,增加服務器端的負擔
  1. // 1.html 
  2.  
  3. <div id="clock"></div> 
  4.  
  5. <script> 
  6.  
  7. let clockDiv = document.getElementById('clock'); 
  8.  
  9. setInterval(function(){ 
  10.  
  11. let xhr = new XMLHttpRequest; 
  12.  
  13. xhr.open('GET','/clock',true); 
  14.  
  15. xhr.onreadystatechange = function(){ 
  16.  
  17. if(xhr.readyState == 4 && xhr.status == 200){ 
  18.  
  19. console.log(xhr.responseText); 
  20.  
  21. clockDiv.innerHTML = xhr.responseText; 
  22.  
  23.  
  24.  
  25. xhr.send(); 
  26.  
  27. },1000); 
  28.  
  29. </script> 
  30.  
  31. //輪詢 服務端 
  32.  
  33. let express = require('express'); 
  34.  
  35. let app = express(); 
  36.  
  37. app.use(express.static(__dirname)); 
  38.  
  39. app.get('/clock',function(req,res){ 
  40.  
  41. res.end(new Date().toLocaleString()); 
  42.  
  43. }); 
  44.  
  45. app.listen(8080); 

啟動本地服務,打開http://localhost:8080/1.html,得到如下結果:

淺談Web 實時推送技術,有對比,有總結

2.長輪詢(long-polling)

淺談Web 實時推送技術,有對比,有總結

長輪詢是對輪詢的改進版,客戶端發送HTTP給服務器之后,看有沒有新消息,如果沒有新消息,就一直等待。當有新消息的時候,才會返回給客戶端。在某種程度上減小了網絡帶寬和CPU利用率等問題。由于http數據包的頭部數據量往往很大(通常有400多個字節),但是真正被服務器需要的數據卻很少(有時只有10個字節左右),這樣的數據包在網絡上周期性的傳輸,難免對網絡帶寬是一種浪費

  • 優點:比 Polling 做了優化,有較好的時效性
  • 缺點:保持連接會消耗資源; 服務器沒有返回有效數據,程序超時。
  1. // 2.html 服務端代碼同上 
  2.  
  3. <div id="clock"></div> 
  4.  
  5. <script> 
  6.  
  7. let clockDiv = document.getElementById('clock'
  8.  
  9. function send() { 
  10.  
  11. let xhr = new XMLHttpRequest() 
  12.  
  13. xhr.open('GET''/clock'true
  14.  
  15. xhr.timeout = 2000 // 超時時間,單位是毫秒 
  16.  
  17. xhr.onreadystatechange = function() { 
  18.  
  19. if (xhr.readyState == 4) { 
  20.  
  21. if (xhr.status == 200) { 
  22.  
  23. //如果返回成功了,則顯示結果 
  24.  
  25. clockDiv.innerHTML = xhr.responseText 
  26.  
  27.  
  28. send() //不管成功還是失敗都會發下一次請求 
  29.  
  30.  
  31.  
  32. xhr.ontimeout = function() { 
  33.  
  34. send() 
  35.  
  36.  
  37. xhr.send() 
  38.  
  39.  
  40. send() 
  41.  
  42. </script> 

3.iframe流(streaming)

淺談Web 實時推送技術,有對比,有總結

iframe流方式是在頁面中插入一個隱藏的iframe,利用其src屬性在服務器和客戶端之間創建一條長連接,服務器向iframe傳輸數據(通常是HTML,內有負責插入信息的javascript),來實時更新頁面。

  • 優點:消息能夠實時到達;瀏覽器兼容好
  • 缺點:服務器維護一個長連接會增加開銷;IE、chrome、Firefox會顯示加載沒有完成,圖標會不停旋轉。
  1. // 3.html 
  2.  
  3. <body> 
  4.  
  5. <div id="clock"></div> 
  6.  
  7. <iframe src="/clock" style="display:none"></iframe> 
  8.  
  9. </body> 
  10.  
  11. //iframe流 
  12.  
  13. let express = require('express'
  14.  
  15. let app = express() 
  16.  
  17. app.use(express.static(__dirname)) 
  18.  
  19. app.get('/clock'function(req, res) { 
  20.  
  21. setInterval(function() { 
  22.  
  23. let date = new Date().toLocaleString() 
  24.  
  25. res.write(` 
  26.  
  27. <script type="text/javascript"
  28.  
  29. parent.document.getElementById('clock').innerHTML = "${date}";//改變父窗口dom元素 
  30.  
  31. </script> 
  32.  
  33. `) 
  34.  
  35. }, 1000) 
  36.  
  37. }) 
  38.  
  39. app.listen(8080) 

啟動本地服務,打開http://localhost:8080/3.html,得到如下結果:

淺談Web 實時推送技術,有對比,有總結

上述代碼中,客戶端只請求一次,然而服務端卻是源源不斷向客戶端發送數據,這樣服務器維護一個長連接會增加開銷。

以上我們介紹了三種實時推送技術,然而各自的缺點很明顯,使用起來并不理想,接下來我們著重介紹另一種技術--websocket,它是比較理想的雙向通信技術。

二、WebSocket

1.什么是websocket

WebSocket是一種全新的協議,隨著HTML5草案的不斷完善,越來越多的現代瀏覽器開始全面支持WebSocket技術了,它將TCP的Socket(套接字)應用在了webpage上,從而使通信雙方建立起一個保持在活動狀態連接通道。

一旦Web服務器與客戶端之間建立起WebSocket協議的通信連接,之后所有的通信都依靠這個專用協議進行。通信過程中可互相發送JSON、XML、HTML或圖片等任意格式的數據。由于是建立在HTTP基礎上的協議,因此連接的發起方仍是客戶端,而一旦確立WebSocket通信連接,不論服務器還是客戶端,任意一方都可直接向對方發送報文

初次接觸 WebSocket 的人,都會問同樣的問題:我們已經有了 HTTP 協議,為什么還需要另一個協議?

2.HTTP的局限性

  • HTTP是半雙工協議,也就是說,在同一時刻數據只能單向流動,客戶端向服務器發送請求(單向的),然后服務器響應請求(單向的)。
  • 服務器不能主動推送數據給瀏覽器。這就會導致一些高級功能難以實現,諸如聊天室場景就沒法實現。

3.WebSocket的特點

  • 支持雙向通信,實時性更強
  • 可以發送文本,也可以發送二進制數據
  • 減少通信量:只要建立起WebSocket連接,就希望一直保持連接狀態。和HTTP相比,不但每次連接時的總開銷減少,而且由于WebSocket的首部信息很小,通信量也相應減少了
淺談Web 實時推送技術,有對比,有總結
  •  

相對于傳統的HTTP每次請求-應答都需要客戶端與服務端建立連接的模式,WebSocket是類似Socket的TCP長連接的通訊模式,一旦WebSocket連接建立后,后續數據都以幀序列的形式傳輸。在客戶端斷開WebSocket連接或Server端斷掉連接前,不需要客戶端和服務端重新發起連接請求。在海量并發和客戶端與服務器交互負載流量大的情況下,極大的節省了網絡帶寬資源的消耗,有明顯的性能優勢,且客戶端發送和接受消息是在同一個持久連接上發起,實時性優勢明顯

接下來我看下websocket如何實現客戶端與服務端雙向通信:

  1. // websocket.html 
  2.  
  3. <div id="clock"></div> 
  4.  
  5. <script> 
  6.  
  7. let clockDiv = document.getElementById('clock'
  8.  
  9. let socket = new WebSocket('ws://localhost:9999'
  10.  
  11. //當連接成功之后就會執行回調函數 
  12.  
  13. socket.onopen = function() { 
  14.  
  15. console.log('客戶端連接成功'
  16.  
  17. //再向服務 器發送一個消息 
  18.  
  19. socket.send('hello'//客戶端發的消息內容 為hello 
  20.  
  21.  
  22. //綁定事件是用加屬性的方式 
  23.  
  24. socket.onmessage = function(event) { 
  25.  
  26. clockDiv.innerHTML = event.data 
  27.  
  28. console.log('收到服務器端的響應', event.data) 
  29.  
  30.  
  31. </script> 
  32.  
  33. // websocket.js 
  34.  
  35. let express = require('express'
  36.  
  37. let app = express() 
  38.  
  39. app.use(express.static(__dirname)) 
  40.  
  41. //http服務器 
  42.  
  43. app.listen(3000) 
  44.  
  45. let WebSocketServer = require('ws').Server 
  46.  
  47. //用ws模塊啟動一個websocket服務器,監聽了9999端口 
  48.  
  49. let wsServer = new WebSocketServer({ port: 9999 }) 
  50.  
  51. //監聽客戶端的連接請求 當客戶端連接服務器的時候,就會觸發connection事件 
  52.  
  53. //socket代表一個客戶端,不是所有客戶端共享的,而是每個客戶端都有一個socket 
  54.  
  55. wsServer.on('connection'function(socket) { 
  56.  
  57. //每一個socket都有一個***的ID屬性 
  58.  
  59. console.log(socket) 
  60.  
  61. console.log('客戶端連接成功'
  62.  
  63. //監聽對方發過來的消息 
  64.  
  65. socket.on('message'function(message) { 
  66.  
  67. console.log('接收到客戶端的消息', message) 
  68.  
  69. socket.send('服務器回應:' + message) 
  70.  
  71. }) 
  72.  
  73. }) 

啟動本地服務,打開http://localhost:3000/websocket.html,得到如下結果:

淺談Web 實時推送技術,有對比,有總結

三、Web 實時推送技術的比較

淺談Web 實時推送技術,有對比,有總結

綜上所述:Websocket協議不僅解決了HTTP協議中服務端的被動性,即通信只能由客戶端發起,也解決了數據同步有延遲的問題,同時還帶來了明顯的性能優勢,所以websocket 是Web 實時推送技術的比較理想的方案,但如果要兼容低版本瀏覽器,可以考慮用輪詢來實現。

責任編輯:張燕妮 來源: 頭條科技
相關推薦

2022-07-30 10:08:06

MQTT?協議物聯網

2018-11-07 09:15:04

主流Web服務器

2024-11-04 09:04:20

2023-09-19 15:33:50

Web實時消息推送

2011-07-06 10:23:57

虛擬化服務器

2023-06-28 15:49:35

2022-09-13 10:23:52

MLOpsDevOps開發

2011-08-02 11:08:54

2017-06-06 10:30:12

前端Web寬度自適應

2024-12-25 16:12:18

2025-06-26 04:10:00

2015-03-10 15:32:46

LTE-ALTE

2014-03-17 16:38:27

京東

2020-09-16 15:24:33

監控安裝

2023-01-04 10:45:23

5G

2011-09-08 17:48:33

Web Widget

2009-07-06 10:25:14

Java Web Se

2022-01-28 11:34:39

區塊鏈比特幣技術

2022-01-27 11:34:02

區塊鏈比特幣技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 女女百合av大片一区二区三区九县 | 国产欧美精品一区二区三区 | 亚洲精品9999 | 国产精品毛片一区二区在线看 | 精品一区av | 亚洲欧美激情精品一区二区 | 亚洲毛片在线观看 | 九色 在线| 在线视频 亚洲 | 日韩欧美在线播放 | 亚洲国产精品久久久久秋霞不卡 | av成人在线观看 | 欧美一级欧美一级在线播放 | 久久中文字幕一区 | 午夜国产 | 国产免费一区二区三区网站免费 | 91精品国产乱码久久久久久久久 | 国产免费av网 | 成人午夜精品一区二区三区 | 精品一区二区视频 | 午夜无码国产理论在线 | 久久99国产精一区二区三区 | 狠狠的干狠狠的操 | 欧美不卡一区二区三区 | 中文字幕1区 | 成年人在线播放 | 久久国产日韩欧美 | 亚洲精品久久久 | 综合久久久| 欧美国产亚洲一区二区 | 一级网站| 欧美精品一区久久 | 国产美女一区 | 国产成人精品免高潮在线观看 | 亚洲一区二区三区久久久 | 精品亚洲一区二区 | 99视频在线| 9色网站| 日韩精品一区二区三区中文字幕 | av中文字幕在线播放 | xxxxx黄色片 欧美一区免费 |