亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
onopen 事件處理程序
實(shí)現(xiàn) SSE 的前提條件是什麼?
SSE 與 WebSockets 有何不同?
SSE 可以與任何服務(wù)器端語言一起使用嗎?
如何處理 SSE 的連接錯(cuò)誤或中斷?
我可以使用 SSE 從客戶端向服務(wù)器發(fā)送數(shù)據(jù)嗎?
所有瀏覽器都支持 SSE 嗎?
如何關(guān)閉 SSE 連接?
我可以將 SSE 用於多用戶實(shí)時(shí)應(yīng)用程序嗎?
如何使用 SSE 發(fā)送不同類型的事件?
我可以將 SSE 與 REST API 一起使用嗎?
首頁 web前端 js教程 使用服務(wù)器量事件實(shí)施推送技術(shù)

使用服務(wù)器量事件實(shí)施推送技術(shù)

Feb 24, 2025 am 10:28 AM

Implementing Push Technology Using Server-Sent Events

核心要點(diǎn)

  • Server-Sent Events (SSE) API 實(shí)現(xiàn)了推送技術(shù),數(shù)據(jù)通過持續(xù)的開放連接流式傳輸?shù)娇蛻舳?,避免了反?fù)建立新連接的開銷。
  • 與允許雙向通信的 WebSockets 不同,SSE 只允許服務(wù)器向客戶端推送消息。然而,SSE 具有某些優(yōu)勢,例如支持自定義消息類型和自動重新連接斷開的連接。
  • 客戶端可以通過實(shí)現(xiàn)命名事件來處理事件流中的各種事件類型。此外,可以使用 EventSource 的 onerror 事件處理程序處理錯(cuò)誤,並且客戶端可以隨時(shí)通過調(diào)用 close() 方法終止 EventSource 連接。

與 WebSockets 的比較

許多人完全不知道 SSE 的存在,因?yàn)樗鼈兂31还δ芨鼜?qiáng)大的 WebSockets API 所掩蓋。雖然 WebSockets 允許客戶端和服務(wù)器之間進(jìn)行雙向全雙工通信,但 SSE 只允許服務(wù)器向客戶端推送消息。需要近乎實(shí)時(shí)性能或雙向通信的應(yīng)用程序可能更適合使用 WebSockets。但是,SSE 也比 WebSockets 具有某些優(yōu)勢。例如,SSE 支持自定義消息類型和自動重新連接斷開的連接。這些功能可以在 WebSockets 中實(shí)現(xiàn),但它們在 SSE 中默認(rèn)可用。 WebSockets 應(yīng)用程序還需要支持 WebSockets 協(xié)議的服務(wù)器。相比之下,SSE 建立在 HTTP 之上,可以在標(biāo)準(zhǔn) Web 服務(wù)器中實(shí)現(xiàn)。

檢測支持

SSE 的支持度相對較高,Internet Explorer 是唯一一個(gè)尚不支持它們的 主要瀏覽器。但是,只要 IE 落後,就仍然需要提供功能檢測。在客戶端,SSE 使用 EventSource 對象實(shí)現(xiàn)——這是全局對象的一個(gè)屬性。以下函數(shù)檢測瀏覽器中 EventSource 構(gòu)造函數(shù)是否可用。如果函數(shù)返回 true,則可以使用 SSE。否則,應(yīng)使用輪詢等後備機(jī)制。

function supportsSSE() {
  return !!window.EventSource;
}

連接

要連接到事件流,請調(diào)用 EventSource 構(gòu)造函數(shù),如下所示。您必須指定要訂閱的事件流的 URL。構(gòu)造函數(shù)將自動負(fù)責(zé)打開連接。

EventSource(url);

onopen 事件處理程序

建立連接後,將調(diào)用 EventSource 的 onopen 事件處理程序。事件處理程序?qū)⒋蜷_事件作為其唯一參數(shù)。以下示例顯示了一個(gè)通用的 onopen 事件處理程序。

source.onopen = function(event) {
  // 處理打開事件
};

EventSource 事件處理程序也可以使用 addEventListener() 方法編寫。此替代語法優(yōu)於 onopen,因?yàn)樗试S多個(gè)處理程序附加到同一事件。以下使用 addEventListener() 重寫了之前的 onopen 事件處理程序。

source.addEventListener("open", function(event) {
  // 處理打開事件
}, false);

接收消息

客戶端將事件流解釋為一系列 DOM 消息事件。從服務(wù)器接收到的每個(gè)事件都會觸發(fā) EventSource 的 onmessage 事件處理程序。 onmessage 處理程序?qū)⑾⑹录鳛槠湮ㄒ粎?shù)。以下示例創(chuàng)建了一個(gè) onmessage 事件處理程序。

function supportsSSE() {
  return !!window.EventSource;
}

消息事件包含三個(gè)重要的屬性——data、origin 和 lastEventId。顧名思義,data 包含實(shí)際的消息數(shù)據(jù)(字符串格式)。數(shù)據(jù)可能是 JSON 字符串,可以傳遞給 JSON.parse() 方法。 origin 屬性包含事件流在任何重定向後的最終 URL。應(yīng)檢查 origin 以驗(yàn)證是否僅從預(yù)期來源接收消息。最後,lastEventId 屬性包含事件流中看到的最後一條消息標(biāo)識符。服務(wù)器可以使用此屬性將標(biāo)識符附加到各個(gè)消息。如果從未見過任何標(biāo)識符,則 lastEventId 將為空字符串。 onmessage 事件處理程序也可以使用 addEventListener() 方法編寫。以下示例顯示了使用 addEventListener() 重寫的之前的 onmessage 事件處理程序。

EventSource(url);

命名事件

通過實(shí)現(xiàn) 命名事件,單個(gè)事件流可以指定各種類型的事件。命名事件不是由消息事件處理程序處理的。相反,每種類型的命名事件都由其自己的唯一處理程序處理。例如,如果事件流包含名為 foo 的事件,則需要以下事件處理程序。請注意,foo 事件處理程序與消息事件處理程序相同,只是事件類型不同。當(dāng)然,任何其他類型的命名消息都需要單獨(dú)的事件處理程序。

source.onopen = function(event) {
  // 處理打開事件
};

處理錯(cuò)誤

如果事件流出現(xiàn)問題,則會觸發(fā) EventSource 的 onerror 事件處理程序。錯(cuò)誤的一個(gè)常見原因是連接中斷。儘管 EventSource 對象會自動嘗試重新連接到服務(wù)器,但在斷開連接時(shí)也會觸發(fā)錯(cuò)誤事件。以下示例顯示了一個(gè) onerror 事件處理程序。

source.addEventListener("open", function(event) {
  // 處理打開事件
}, false);

當(dāng)然,onerror 事件處理程序也可以使用 addEventListener() 重寫,如下所示。

source.onmessage = function(event) {
  var data = event.data;
  var origin = event.origin;
  var lastEventId = event.lastEventId;
  // 處理消息
};

斷開連接

客戶端可以隨時(shí)通過調(diào)用 close() 方法終止 EventSource 連接。 close() 的語法如下所示。 close() 方法不接受任何參數(shù),也不返回任何值。

source.addEventListener("message", function(event) {
  var data = event.data;
  var origin = event.origin;
  var lastEventId = event.lastEventId;
  // 處理消息
}, false);

連接狀態(tài)

EventSource 連接的狀態(tài)存儲在其 readyState 屬性中。在其生命週期的任何時(shí)間點(diǎn),連接都可以處於三種可能的狀態(tài)之一——連接中、打開和關(guān)閉。以下列表描述了每種狀態(tài)。

  • 連接中 – 創(chuàng)建 EventSource 對象時(shí),它最初會進(jìn)入連接中狀態(tài)。在此期間,連接尚未建立。如果已建立的連接丟失,EventSource 也將轉(zhuǎn)換到連接中狀態(tài)。處於連接中狀態(tài)的 EventSocket 的 readyState 值為 0。此值定義為常量 EventSource.CONNECTING。
  • 打開 – 已建立的連接被稱為處於打開狀態(tài)。處於打開狀態(tài)的 EventSource 對象可以接收數(shù)據(jù)。 readyState 值為 1 對應(yīng)於打開狀態(tài)。此值定義為常量 EventSource.OPEN。
  • 關(guān)閉 – 如果未建立連接並且未嘗試重新連接,則 EventSource 被稱為處於關(guān)閉狀態(tài)。此狀態(tài)通常通過調(diào)用 close() 方法進(jìn)入。處於關(guān)閉狀態(tài)的 EventSource 的 readyState 值為 2。此值定義為常量 EventSource.CLOSED。

以下示例顯示瞭如何使用 readyState 屬性檢查 EventSource 連接。為了避免硬編碼 readyState 值,該示例使用了狀態(tài)常量。

function supportsSSE() {
  return !!window.EventSource;
}

結(jié)論

本文介紹了 SSE 的客戶端方面。如果您有興趣了解有關(guān) SSE 的更多信息,我建議您閱讀《服務(wù)器端 SSE》。我還撰寫了一篇更實(shí)用的文章,介紹了 Node.js 中的 SSE。享受!

關(guān)於使用 SSE 實(shí)現(xiàn)推送技術(shù)的常見問題 (FAQ)

實(shí)現(xiàn) SSE 的前提條件是什麼?

要實(shí)現(xiàn) SSE,您需要對 JavaScript 和 Node.js 有基本的了解。您還應(yīng)該熟悉 HTTP 的概念及其工作原理。此外,了解事件驅(qū)動編程可能會有益,因?yàn)?SSE 基於此概念。

SSE 與 WebSockets 有何不同?

雖然 SSE 和 WebSockets 都提供實(shí)時(shí)數(shù)據(jù)更新,但它們的功能和用例有所不同。 WebSockets 在客戶端和服務(wù)器之間提供雙向通信通道,允許雙方隨時(shí)發(fā)送數(shù)據(jù)。另一方面,SSE 是一條單向通信通道,只有服務(wù)器才能向客戶端推送更新。這使得 SSE 更適合那些數(shù)據(jù)更新主要由服務(wù)器啟動的應(yīng)用程序。

SSE 可以與任何服務(wù)器端語言一起使用嗎?

是的,SSE 可以與任何支持 HTTP 的服務(wù)器端語言一起使用。這包括 Node.js、Python、PHP、Ruby 等語言。關(guān)鍵是設(shè)置正確的 HTTP 標(biāo)頭並根據(jù) SSE 規(guī)範(fàn)格式化數(shù)據(jù)。

如何處理 SSE 的連接錯(cuò)誤或中斷?

用於在客戶端實(shí)現(xiàn) SSE 的 EventSource API 會在連接丟失時(shí)自動嘗試重新連接到服務(wù)器。您還可以偵聽 EventSource 對像上的“error”事件,以手動處理連接錯(cuò)誤或中斷。

我可以使用 SSE 從客戶端向服務(wù)器發(fā)送數(shù)據(jù)嗎?

不可以,SSE 旨在用於從服務(wù)器到客戶端的單向通信。如果您需要從客戶端向服務(wù)器發(fā)送數(shù)據(jù),可以使用傳統(tǒng)的 AJAX 請求或切換到雙向通信技術(shù),例如 WebSockets。

所有瀏覽器都支持 SSE 嗎?

大多數(shù)現(xiàn)代瀏覽器都支持 SSE。但是,Internet Explorer 不支持 SSE。您可以使用 EventSource.js 等 polyfill 在不受支持的瀏覽器中添加對 SSE 的支持。

如何關(guān)閉 SSE 連接?

您可以通過調(diào)用 EventSource 對像上的 close() 方法來關(guān)閉 SSE 連接。這將阻止服務(wù)器向客戶端發(fā)送更多更新。

我可以將 SSE 用於多用戶實(shí)時(shí)應(yīng)用程序嗎?

是的,您可以將 SSE 用於多用戶實(shí)時(shí)應(yīng)用程序。但是,請記住,每個(gè)用戶都會打開與服務(wù)器的單獨(dú)連接。如果您有大量用戶,這可能會導(dǎo)致服務(wù)器負(fù)載過高。

如何使用 SSE 發(fā)送不同類型的事件?

您可以通過在從服務(wù)器發(fā)送的數(shù)據(jù)中包含“event”字段來發(fā)送不同類型的事件。然後,客戶端可以使用 EventSource 對像上的 addEventListener() 方法偵聽這些特定事件類型。

我可以將 SSE 與 REST API 一起使用嗎?

是的,您可以將 SSE 與 REST API 一起使用。服務(wù)器可以在資源更改時(shí)向客戶端發(fā)送更新。這對於在不進(jìn)行輪詢的情況下使客戶端與服務(wù)器狀態(tài)保持同步非常有用。

以上是使用服務(wù)器量事件實(shí)施推送技術(shù)的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在node.js中提出HTTP請求? 如何在node.js中提出HTTP請求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。 1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場景,但需手動處理數(shù)據(jù)拼接和錯(cuò)誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請求;2.axios是基於Promise的第三方庫,語法簡潔且功能強(qiáng)大,支持async/await、自動JSON轉(zhuǎn)換、攔截器等,推薦用於簡化異步請求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基於Promise且語法簡單

React與Angular vs Vue:哪個(gè)JS框架最好? React與Angular vs Vue:哪個(gè)JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個(gè)JavaScript框架最好?答案是根據(jù)需求選擇最適合的。 1.React靈活自由,適合需要高度定制、團(tuán)隊(duì)有架構(gòu)能力的中大型項(xiàng)目;2.Angular提供完整解決方案,適合企業(yè)級應(yīng)用和長期維護(hù)的大項(xiàng)目;3.Vue上手簡單,適合中小型項(xiàng)目或快速開發(fā)。此外,是否已有技術(shù)棧、團(tuán)隊(duì)規(guī)模、項(xiàng)目生命週期及是否需要SSR也都是選擇框架的重要因素??傊瑳]有絕對最好的框架,適合自己需求的就是最佳選擇。

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

JavaScript時(shí)間對象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時(shí)間對象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本週的JavaScript新聞!本週我們將重點(diǎn)關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時(shí)間對象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開發(fā)者工具。讓我們開始吧! Oracle與Deno的商標(biāo)之爭Oracle試圖註冊“JavaScript”商標(biāo)的舉動引發(fā)爭議。 Node.js和Deno的創(chuàng)建者RyanDahl已提交請願(yuàn)書,要求取消該商標(biāo),他認(rèn)為JavaScript是一個(gè)開放標(biāo)準(zhǔn),不應(yīng)由Oracle

處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鍊式調(diào)用、錯(cuò)誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。 1.鍊式調(diào)用通過.then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個(gè).then()接收上一步結(jié)果並可返回值或Promise;2.錯(cuò)誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,並可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個(gè)完成即返回)和Promise.allSettled()(等待所有完成)

什麼是緩存API?如何與服務(wù)人員使用? 什麼是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗(yàn)。 1.它允許開發(fā)者手動存儲如腳本、樣式表、圖片等資源;2.可根據(jù)請求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個(gè)緩存;4.通過ServiceWorker監(jiān)聽fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用於離線支持、加快重複訪問速度、預(yù)加載關(guān)鍵資源及後臺更新內(nèi)容;6.使用時(shí)需注意緩存版本控制、存儲限制及與HTTP緩存機(jī)制的區(qū)別。

利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 Jul 06, 2025 am 02:36 AM

JavaScript數(shù)組內(nèi)置方法如.map()、.filter()和.reduce()可簡化數(shù)據(jù)處理;1).map()用於一對一轉(zhuǎn)換元素生成新數(shù)組;2).filter()按條件篩選元素;3).reduce()用於聚合數(shù)據(jù)為單一值;使用時(shí)應(yīng)避免誤用導(dǎo)致副作用或性能問題。

JS綜述:深入研究JavaScript事件循環(huán) JS綜述:深入研究JavaScript事件循環(huán) Jul 08, 2025 am 02:24 AM

JavaScript的事件循環(huán)通過協(xié)調(diào)調(diào)用棧、WebAPI和任務(wù)隊(duì)列來管理異步操作。 1.調(diào)用棧執(zhí)行同步代碼,遇到異步任務(wù)時(shí)交由WebAPI處理;2.WebAPI在後臺完成任務(wù)後將回調(diào)放入相應(yīng)的隊(duì)列(宏任務(wù)或微任務(wù));3.事件循環(huán)檢查調(diào)用棧是否為空,若為空則從隊(duì)列中取出回調(diào)推入調(diào)用棧執(zhí)行;4.微任務(wù)(如Promise.then)優(yōu)先於宏任務(wù)(如setTimeout)執(zhí)行;5.理解事件循環(huán)有助於避免阻塞主線程並優(yōu)化代碼執(zhí)行順序。

See all articles