国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse

這篇具有很好參考價值的文章主要介紹了如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在日常的開發(fā)中,我們經(jīng)常能碰見服務端需要主動推送給客戶端數(shù)據(jù)的業(yè)務場景,比如_數(shù)據(jù)大屏的實時數(shù)據(jù)_,比如_消息中心的未讀消息_,比如_聊天功能_等等。

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

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse,前端,typescript
學習就完事了

服務端向客戶端推送數(shù)據(jù)的實現(xiàn)方案有哪幾種?

我們常規(guī)實現(xiàn)這些需求的方案有以下三種

  1. 輪詢

  2. websocket

  3. SSE

輪詢簡介

在很久很久以前,前端一般使用輪詢來進行服務端向客戶端進行消息的_偽推送_,為什么說輪詢是偽推送?因為_輪詢本質(zhì)上還是通過客戶端向服務端發(fā)起一個單項傳輸?shù)恼埱骭,服務端對這個請求做出響應而已。通過不斷的請求來實現(xiàn)服務端向客戶端推送數(shù)據(jù)的錯覺。并不是服務端主動向客戶端推送數(shù)據(jù)。顯然,輪詢一定是上述三個方法里最下策的決定。

輪詢的缺點:

  1. 首先輪詢需要不斷的發(fā)起請求,_每一個請求都需要經(jīng)過http建立連接的流程_(比如三次握手,四次揮手),是沒有必要的消耗。

  2. 客戶端需要從頁面被打開的那一刻開始就_一直處理請求_。雖然每次輪詢的消耗不大,但是一直處理請求對于客戶端來說一定是不友好的。

  3. _瀏覽器請求并發(fā)是有限制的_。比如Chrome 最大并發(fā)請求數(shù)目為 6,這個限制還有一個前提是針對同一域名的,超過這一限制的后續(xù)請求將會被阻塞。_而輪詢意味著會有一個請求長時間的占用并發(fā)名額_。

  4. 而如果輪詢時間較長,可能又_沒有辦法非常及時的獲取數(shù)據(jù)_

websocket簡介

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

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

相較于SSE來說,websocket因為功能更強大。結(jié)構(gòu)更復雜。所以相對比較_重_。

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

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse,前端,typescript

SSE簡介

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

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

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

注意:IE大魔王不支持SSE

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

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse,前端,typescript

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

websocket和SSE有什么區(qū)別?

輪詢

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

Websocket和SSE

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

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

  1. WebSocket是全雙工通道,可以雙向通信,功能更強;SSE是單向通道,只能服務器向瀏覽器端發(fā)送。

  2. WebSocket是一個新的協(xié)議,需要服務器端支持;SSE則是部署在HTTP協(xié)議之上的,現(xiàn)有的服務器軟件都支持。

  3. SSE是一個輕量級協(xié)議,相對簡單;WebSocket是一種較重的協(xié)議,相對復雜。

  4. SSE默認支持斷線重連,WebSocket則需要額外部署。

  5. SSE支持自定義發(fā)送的數(shù)據(jù)類型。

Websocket和SSE分別適用于什么業(yè)務場景?

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

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

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

SSE有哪些主要的API?

建立一個SSE鏈接?:var?source?=?new?EventSource(url);
SSE連接狀態(tài)

source.readyState

  • 0,相當于常量EventSource.CONNECTING,表示連接還未建立,或者連接斷線。

  • 1,相當于常量EventSource.OPEN,表示連接已經(jīng)建立,可以接受數(shù)據(jù)。

  • 2,相當于常量EventSource.CLOSED,表示連接已斷,且不會重連。

SSE相關(guān)事件
  • open事件(連接一旦建立,就會觸發(fā)open事件,可以定義相應的回調(diào)函數(shù))

  • message事件(收到數(shù)據(jù)就會觸發(fā)message事件)

  • error事件(如果發(fā)生通信錯誤(比如連接中斷),就會觸發(fā)error事件)

數(shù)據(jù)格式
Content-Type:?text/event-stream?//文本返回格式
Cache-Control:?no-cache??//不要緩存
Connection:?keep-alive?//長鏈接標識

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse,前端,typescript

SSE:相關(guān)文檔,文檔入口文檔入口文檔入口文檔入口[1]

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

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse,前端,typescript

demo請看下方

我更建議您先把Demo跑起來,然后在看看上面這個w3cschool的SSE文檔[2]。兩個配合一起看,會更方便理解些。

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse,前端,typescript

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

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

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

  1. 第一步,建立一個index.html文件,然后復制前端代碼Demo到index.html文件中,打開文件

  2. 第二步,進入一個新的文件夾,建立一個index.js文件,然后將后端Demo代碼復制進去,然后在該文件夾下執(zhí)行

npm?init??????????//初始化npm???????
npm?i?express?????//下載node?express框架
node?index????????//啟動服務

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse,前端,typescript

在這一層文件夾下執(zhí)行命令。

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

前端代碼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")
?}

?//對于建立鏈接的監(jiān)聽
?source.onopen?=?function(event)?{
???console.log(source.readyState);
???console.log("長連接打開");
?};

?//對服務端消息的監(jiān)聽
?source.onmessage?=?function(event)?{
???console.log(JSON.parse(event.data));
???console.log("收到長連接信息");
???let?li?=?createLi(JSON.parse(event.data));
???document.getElementById("ul").appendChild(li)
?};

?//對斷開鏈接的監(jiān)聽
?source.onerror?=?function(event)?{
???console.log(source.readyState);
???console.log("長連接中斷");
?};

</script>
</html>

后端代碼Demo(node的express)

const?express?=?require('express');?//引用框架
const?app?=?express();?//創(chuàng)建服務
const?port?=?8088;?//項目啟動端口

//設(shè)置跨域訪問
app.all("*",?function(req,?res,?next)?{
?//設(shè)置允許跨域的域名,*代表允許任意域名跨域
?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',?//設(shè)定數(shù)據(jù)類型
????????'Cache-Control':?'no-cache',//?長鏈接拒絕緩存
????????'Connection':?'keep-alive'?//設(shè)置長鏈接
??????});

??????console.log("進入到長連接了")
??????//持續(xù)返回數(shù)據(jù)
??????setInterval(()?=>?{
????????console.log("正在持續(xù)返回數(shù)據(jù)中ing")
????????const?data?=?{
??????????message:?`Current?time?is?${new?Date().toLocaleTimeString()}`
????????};
????????res.write(`data:?${JSON.stringify(data)}\n\n`);
??????},?1000);??
})

//創(chuàng)建項目
app.listen(port,?()?=>?{
?console.log(`項目啟動成功-http://localhost:${port}`)
})

效果

如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse,前端,typescript

結(jié)語

加油整起來,有什么好的建議,可以下方評論留言文章來源地址http://www.zghlxwxcb.cn/news/detail-841356.html

到了這里,關(guān)于如果讓你實現(xiàn)實時消息推送你會用什么技術(shù)?輪詢、websocket還是sse的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • JAVA Socket實現(xiàn)實時接收TCP消息,讓你的服務端通信更高效!

    JAVA Socket實現(xiàn)實時接收TCP消息,讓你的服務端通信更高效!

    本文主要介紹如何利用socket實現(xiàn)實時接收服務端發(fā)送的TCP消息。 目錄 一、需要掌握 二、程序源碼 三、運行演示 網(wǎng)絡(luò)調(diào)試助手下載:https://www.aliyundrive.com/s/6Y8L7Wv5sT6 網(wǎng)絡(luò)通信協(xié)議的理解:JAVA socket是基于TCP/IP協(xié)議實現(xiàn)的,需要對TCP/IP協(xié)議有一定的了解,包括TCP連接的建立、數(shù)

    2024年02月11日
    瀏覽(19)
  • SpringBoot集成WebSocket(實時消息推送)

    SpringBoot集成WebSocket(實時消息推送)

    ?? 簡介:java系列技術(shù)分享(??持續(xù)更新中…??) ?? 初衷:一起學習、一起進步、堅持不懈 ?? 如果文章內(nèi)容有誤與您的想法不一致,歡迎大家在評論區(qū)指正?? ?? 希望這篇文章對你有所幫助,歡迎點贊 ?? 收藏 ?留言 ?? ?? 更多文章請點擊 調(diào)試工具 :http://coolaf.com/tool/chatt

    2024年04月29日
    瀏覽(25)
  • 用Vue3.0 寫過組件嗎?如果想實現(xiàn)一個 Modal你會怎么設(shè)計?

    用Vue3.0 寫過組件嗎?如果想實現(xiàn)一個 Modal你會怎么設(shè)計?

    組件就是把圖形、非圖形的各種邏輯均抽象為一個統(tǒng)一的概念(組件)來實現(xiàn)開發(fā)的模式 現(xiàn)在有一個場景,點擊新增與編輯都彈框出來進行填寫,功能上大同小異,可能只是標題內(nèi)容或者是顯示的主體內(nèi)容稍微不同 這時候就沒必要寫兩個組件,只需要根據(jù)傳入的參數(shù)不同,

    2024年03月09日
    瀏覽(38)
  • 都聽說過 lodash,但你會用嗎?

    Lodash 是 JavaScript 社區(qū)最出名的一個工具庫,提供了許多高效、高兼容性的工具函數(shù)。 不過,隨著瀏覽器和 web 技術(shù)的發(fā)展,一些人開始反對在項目中使用 lodash。主要原因有: ES6 之后拓展了 JavaScript 特性,許多功能不再需要額外工具庫。 現(xiàn)代瀏覽器對 ES 語法的支持性提升。

    2024年02月16日
    瀏覽(23)
  • thinkphp結(jié)合WebSocket 實時推送消息詳細實例

    實時推送消息是現(xiàn)代 Web 應用程序中常見的一種需求,而 WebSocket 已成為實時通信的首選技術(shù)。ThinkPHP 提供了對 WebSocket 的支持,本文將演示如何使用 ThinkPHP 實現(xiàn) WebSocket 實時推送消息的詳細例子。 安裝 Swoole 在開始之前,你需要先安裝 Swoole 擴展。可以使用以下命令來安裝:

    2024年03月20日
    瀏覽(26)
  • 快看!華為Python搶購腳本你會用嗎?

    快看!華為Python搶購腳本你會用嗎?

    目錄 1.前言 2.原理 3.下載Python 4.安裝瀏覽器 5.安裝瀏覽器驅(qū)動 6.安裝依賴包 7.配置文件修改 8.運行main.py 9.特別說明 10.關(guān)注我 微信公眾號:漫漫編程路 PS:公眾號后臺回復 “HW” 獲取搶購軟件??! 1.前言 ??鑒于最近不少小伙伴的后臺的留言與提問,很多是關(guān)于該腳本如何使

    2024年01月22日
    瀏覽(17)
  • 前端小白也能懂!實時消息小紅點學會使用 RabbitMQ 推送消息

    前端小白也能懂!實時消息小紅點學會使用 RabbitMQ 推送消息

    在Web應用程序中使用實時消息推送可以為用戶提供更好的體驗。例如,在聊天室或社交媒體上,用戶會看到其他用戶發(fā)送的消息的實時更新,這提高了用戶參與感,并為用戶提供了方便。實時消息推送技術(shù)在許多場景中都是必不可少的,比如在線游戲,實時股票報價等。 實時

    2024年02月08日
    瀏覽(23)
  • Apifox WebSocket 調(diào)試功能你會用了嗎?

    Apifox WebSocket 調(diào)試功能你會用了嗎?

    在 2.2.32 及更高版本的 Apifox 中,支持對? WebSocket API ?進行調(diào)試。 WebSocket ?是一種在單個 TCP 連接上進行全雙工通信的 API 技術(shù)。相比于傳統(tǒng)的 HTTP 請求,WebSocket 具有更低的延遲和更高的效率。它適用于需要長時間保持連接并實時傳輸數(shù)據(jù)的場景,例如在線游戲、實時聊天等

    2024年02月08日
    瀏覽(19)
  • 想進大廠, Jira 管理平臺你會用么?

    想進大廠, Jira 管理平臺你會用么?

    作為一名測試工程師,管理bug的生命周期是每天必備的日常工作;所以缺陷管理流程,以及缺陷如何記錄并完成跟蹤,都是測試必須要掌握的技能,然而管理缺陷需要借助缺陷管理平臺。 目前比較主流和常見的一些缺陷管理平臺有如下幾款: 本文章給大家重點講解 Jira這個平

    2024年02月07日
    瀏覽(22)
  • 如果SSE推送不穩(wěn)定,是不是可以考慮切換成WebSocket,各自有什么優(yōu)缺點

    面對 Server-Sent Events (SSE) 推送不穩(wěn)定的情況時,可以考慮切換到 WebSocket。SSE 和 WebSocket 都是現(xiàn)代Web應用中用于實現(xiàn)實時通信的技術(shù),但它們有各自的優(yōu)缺點和最適用的場景。 Server-Sent Events (SSE) 優(yōu)點 簡單性 :SSE 在使用上比 WebSocket 更簡單,特別是在僅需要單向通信(服務器到

    2024年02月04日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包