精品熟人妻一区二区三区四区不卡-精品爽黄69天堂a-精品水蜜桃久久久久久久-精品丝袜国产自在线拍-精品丝袜国产自在线拍a-精品丝袜国产自在线拍免费看

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

放棄websocket,改用SSE實現服務器向客戶端瀏覽器推送新信息提醒

admin
2025年4月21日 18:32 本文熱度 148
作者:工邊頁字

https://juejin.cn/post/7325730345840066612

前言


在日常的開發中,我們經常能碰見服務端需要主動推送給客戶端數據的業務場景,比如數據大屏的實時數據,比如消息中心的未讀消息,比如聊天功能等等。

本文主要介紹SSE的使用場景和如何使用SSE。

服務端向客戶端推送數據的實現方案有哪幾種?

我們常規實現這些需求的方案有以下三種

  1. 輪詢
  2. websocket
  3. SSE


輪詢簡介


在很久很久以前,前端一般使用輪詢來進行服務端向客戶端進行消息的偽推送,為什么說輪詢是偽推送?因為輪詢本質上還是通過客戶端向服務端發起一個單項傳輸的請求,服務端對這個請求做出響應而已。

通過不斷的請求來實現服務端向客戶端推送數據的錯覺。并不是服務端主動向客戶端推送數據。顯然,輪詢一定是上述三個方法里最下策的決定。

輪詢的缺點:

  1. 首先輪詢需要不斷的發起請求,每一個請求都需要經過http建立連接的流程(比如三次握手,四次揮手),是沒有必要的消耗。
  2. 客戶端需要從頁面被打開的那一刻開始就一直處理請求。雖然每次輪詢的消耗不大,但是一直處理請求對于客戶端來說一定是不友好的。
  3. 瀏覽器請求并發是有限制的。比如Chrome 最大并發請求數目為 6,這個限制還有一個前提是針對同一域名的,超過這一限制的后續請求將會被阻塞。而輪詢意味著會有一個請求長時間的占用并發名額。
  4. 而如果輪詢時間較長,可能又沒有辦法非常及時的獲取數據


websocket簡介


websocket是一個雙向通訊的協議,他的優點是,可以同時支持客戶端和服務端彼此相互進行通訊。功能上很強大。


缺點也很明顯,websocket是一個新的協議,ws/wss。也就是說,支持http協議的瀏覽器不一定支持ws協議。

相較于SSE來說,websocket因為功能更強大。結構更復雜。所以相對比較重。

websocket對于各大瀏覽器的兼容性↓


SSE簡介


sse是一個單向通訊的協議也是一個長鏈接,它只能支持服務端主動向客戶端推送數據,但是無法讓客戶端向服務端推送消息。


長鏈接是一種HTTP/1.1的持久連接技術,
它允許客戶端和服務器在一次TCP連接上進行多個HTTP請求和響應,
而不必為每個請求/響應建立和斷開一個新的連接。
長連接有助于減少服務器的負載和提高性能。

SSE的優點是,它是一個輕量級的協議,相對于websockte來說,他的復雜度就沒有那么高,相對于客戶端的消耗也比較少。而且SSE使用的是http協議(websocket使用的是ws協議),也就是現有的服務端都支持SSE,無需像websocket一樣需要服務端提供額外的支持。

注意:IE大魔王不支持SSE

SSE對于各大瀏覽器的兼容性↓


注意哦,上圖是SSE對于瀏覽器的兼容不是對于服務端的兼容。

websocket和SSE有什么區別?


輪詢


對于當前計算機的發展來說,幾乎很少出現同時不支持websocket和sse的情況,所以輪詢是在極端情況下瀏覽器實在是不支持websocket和see的下策。

Websocket和SSE


我們一般的服務端和客戶端的通訊基本上使用這兩個方案。首先聲明:這兩個方案沒有絕對的好壞,只有在不同的業務場景下更好的選擇。

SSE的官方對于SSE和Websocket的評價是

  1. WebSocket是全雙工通道,可以雙向通信,功能更強;SSE是單向通道,只能服務器向瀏覽器端發送。
  2. WebSocket是一個新的協議,需要服務器端支持;SSE則是部署在HTTP協議之上的,現有的服務器軟件都支持。
  3. SSE是一個輕量級協議,相對簡單;WebSocket是一種較重的協議,相對復雜。
  4. SSE默認支持斷線重連,WebSocket則需要額外部署。
  5. SSE支持自定義發送的數據類型。


Websocket和SSE分別適用于什么業務場景?


對于SSE來說,它的優點就是輕,而且對于服務端的支持度要更好。換言之,可以使用SSE完成的功能需求,沒有必要使用更重更復雜的websocket。

比如:數據大屏的實時數據,消息中心的消息推送等一系列只需要服務端單方面推送而不需要客戶端同時進行反饋的需求,SSE就是不二之選。

對于Websocket來說,他的優點就是可以同時支持客戶端和服務端的雙向通訊。所適用的業務場景:最典型的就是聊天功能。這種服務端需要主動向客戶端推送信息,并且客戶端也有向服務端推送消息的需求時,Websocket就是更好的選擇。

SSE有哪些主要的API?


建立一個SSE鏈接 :var source = new EventSource(url);


SSE連接狀態

source.readyState

  • 0,相當于常量EventSource.CONNECTING,表示連接還未建立,或者連接斷線。
  • 1,相當于常量EventSource.OPEN,表示連接已經建立,可以接受數據。
  • 2,相當于常量EventSource.CLOSED,表示連接已斷,且不會重連。


SSE相關事件

  • open事件(連接一旦建立,就會觸發open事件,可以定義相應的回調函數)
  • message事件(收到數據就會觸發message事件)
  • error事件(如果發生通信錯誤(比如連接中斷),就會觸發error事件)


數據格式

Content-Type: text/event-stream //文本返回格式Cache-Control: no-cache  //不要緩存Connection: keep-alive //長鏈接標識


SSE相關文檔:.w3cschool.cn/nwfchn/wpi3cozt.html

顯然,如果直接看api介紹不論是看這里還是看官網,大部分同學都是比較懵圈的狀態,那么我們寫個demo來看一下?


如何實操一個SSE鏈接?Demo↓


這里Demo前端使用的就是最基本的html靜態頁面連接,沒有使用任何框架。后端選用語言是node,框架是Express。

理論上,把這兩段端代碼復制過去跑起來就直接可以用了。

  1. 第一步,建立一個index.html文件,然后復制前端代碼Demo到index.html文件中,打開文件
  2. 第二步,進入一個新的文件夾,建立一個index.js文件,然后將后端Demo代碼復制進去,然后在該文件夾下執行
npm init          //初始化npm       npm i express     //下載node express框架node index        //啟動服務



在這一層文件夾下執行命令。

完成以上操作就可以把項目跑起來了


前端代碼Demo

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <ul id="ul">            </ul></body><script>
//生成li元素function createLi(data){    let li = document.createElement("li");    li.innerHTML = String(data.message);    return li;}    //判斷當前瀏覽器是否支持SSE  let source = '' if (!!window.EventSource) {    source = new EventSource('http://localhost:8088/sse/'); }else{    throw new Error("當前瀏覽器不支持SSE") }
 //對于建立鏈接的監聽 source.onopen = function(event) {   console.log(source.readyState);   console.log("長連接打開"); };
 //對服務端消息的監聽 source.onmessage = function(event) {   console.log(JSON.parse(event.data));   console.log("收到長連接信息");   let li = createLi(JSON.parse(event.data));   document.getElementById("ul").appendChild(li) };
 //對斷開鏈接的監聽 source.onerror = function(event) {   console.log(source.readyState);   console.log("長連接中斷"); };</script></html>


后端代碼Demo(node的express)

const express = require('express'); //引用框架const app = express(); //創建服務const port = 8088//項目啟動端口
//設置跨域訪問app.all("*"function(req, res, next) {  //設置允許跨域的域名,*代表允許任意域名跨域  res.header("Access-Control-Allow-Origin"'*');  //允許的header類型  res.header("Access-Control-Allow-Headers""Content-Type, Authorization, X-Requested-With");  //跨域允許的請求方式   res.header("Access-Control-Allow-Methods""PUT,POST,GET,DELETE,OPTIONS");  // 可以帶cookies  res.header("Access-Control-Allow-Credentials"true);  if (req.method == 'OPTIONS') {    res.sendStatus(200);  } else {    next();  }})
app.get("/sse",(req,res) => {    res.set({        'Content-Type''text/event-stream'//設定數據類型        'Cache-Control''no-cache',// 長鏈接拒絕緩存        'Connection''keep-alive' //設置長鏈接      });
      console.log("進入到長連接了")      //持續返回數據      setInterval(() => {        console.log("正在持續返回數據中ing")        const data = {          message`Current time is ${new Date().toLocaleTimeString()}`        };        res.write(`data: ${JSON.stringify(data)}\n\n`);      }, 1000);  })
//創建項目app.listen(port, () => {  console.log(`項目啟動成功-http://localhost:${port}`)})


效果


總結

  1. SSE比websocket更輕
  2. SSE是基于http/https協議的
  3. websocket是一個新的協議,ws/wss協議
  4. 如果只需要服務端向客戶端推送消息,推薦使用SSE
  5. 如果需要服務端和客戶端雙向推送,請選擇websocket
  6. 不論是SSE還是websocket,對于瀏覽器的兼容性都不錯
  7. 輪詢是下策,很占用客戶端資源,不建議使用。(不過偷懶的時候他確實方便)
  8. IE不支持SSE

對了,小程序不支持SSE哦

- End -


該文章在 2025/4/22 17:21:43 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 欧美影院首页 | 亚洲爆乳无 | 少妇人妻久久久久久97人妻 | 97成人无码免费一区二区中文 | 欧美性大战久久久久xxx | 99国产在线观看 | 97免费人妻视在线视频 | 无码专区午夜福利在线观看 | 99久久婷婷 | 国产超碰人人做人人 | 巨爆乳无码视频在线观看 | 日韩版码免费福利视频 | 亚洲性无 | 国产一级婬片a片aaa毛片小说 | 国产区视频在线观看 | 亚洲精品成人久久av | 欧美高潮喷水hd | 国产综合国产精品 | 中文字幕一区二区三区精品 | 天天av翘人人添亚洲综合网 | 欧美亚洲人成网站在线观看 | 国产亚洲精品久久久999功能介绍 | 国产麻豆剧果冻传媒白晶晶 | 日本在线高清版卡免v | 97视频官网版下载 | 亚洲精品国产乱码在线看天美 | 巨乳人妻的誘惑高清完整版在线观看 | 亚洲一区二区三区在线网站 | 国产色噜噜噜在线精品 | 亚洲熟女www一区二区三区 | 97久人人做人人妻人人玩精品 | 精品麻豆色欲色欲色欲w | 欧美在线视频精品一区 | 国产精品视频一区国模私拍 | 亚洲熟妇无码av不卡在线播放 | 变态另类欧美大码日韩 | 国产乱人伦在线播放 | 成人午夜电影免费完整在线看 | 国产在线无码精 | 亚洲一区二区三区久久 | 人妻少妇久久久久久97人妻 |