国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
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)勢,例如支持自定義消息類型和自動(dòng)重新連接斷開的連接。
  • 客戶端可以通過實(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 支持自定義消息類型和自動(dòng)重新連接斷開的連接。這些功能可以在 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ù)將自動(dòng)負(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è)事件都會(huì)觸發(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)識(shí)符。服務(wù)器可以使用此屬性將標(biāo)識(shí)符附加到各個(gè)消息。如果從未見過任何標(biāo)識(shí)符,則 lastEventId 將為空字符串。 onmessage 事件處理程序也可以使用 addEventListener() 方法編寫。以下示例顯示了使用 addEventListener() 重寫的之前的 onmessage 事件處理程序。

EventSource(url);

命名事件

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

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

處理錯(cuò)誤

如果事件流出現(xiàn)問題,則會(huì)觸發(fā) EventSource 的 onerror 事件處理程序。錯(cuò)誤的一個(gè)常見原因是連接中斷。儘管 EventSource 對象會(huì)自動(dòng)嘗試重新連接到服務(wù)器,但在斷開連接時(shí)也會(huì)觸發(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)存儲(chǔ)在其 readyState 屬性中。在其生命週期的任何時(shí)間點(diǎn),連接都可以處於三種可能的狀態(tài)之一——連接中、打開和關(guān)閉。以下列表描述了每種狀態(tài)。

  • 連接中 – 創(chuàng)建 EventSource 對象時(shí),它最初會(huì)進(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ū)動(dòng)編程可能會(huì)有益,因?yàn)?SSE 基於此概念。

SSE 與 WebSockets 有何不同?

雖然 SSE 和 WebSockets 都提供實(shí)時(shí)數(shù)據(jù)更新,但它們的功能和用例有所不同。 WebSockets 在客戶端和服務(wù)器之間提供雙向通信通道,允許雙方隨時(shí)發(fā)送數(shù)據(jù)。另一方面,SSE 是一條單向通信通道,只有服務(wù)器才能向客戶端推送更新。這使得 SSE 更適合那些數(shù)據(jù)更新主要由服務(wù)器啟動(dòng)的應(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 會(huì)在連接丟失時(shí)自動(dòng)嘗試重新連接到服務(wù)器。您還可以偵聽 EventSource 對像上的“error”事件,以手動(dòng)處理連接錯(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è)用戶都會(huì)打開與服務(wù)器的單獨(dú)連接。如果您有大量用戶,這可能會(huì)導(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ū)動(dòng)的應(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)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用於不同的應(yīng)用場景。 Java用於大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用於網(wǎng)頁開發(fā)。

掌握J(rèn)avaScript評論:綜合指南 掌握J(rèn)avaScript評論:綜合指南 Jun 14, 2025 am 12:11 AM

評論arecrucialinjavascriptformaintainingclarityclarityandfosteringCollaboration.1)heelpindebugging,登機(jī),andOnderStandingCodeeVolution.2)使用林格forquickexexplanations andmentmentsmmentsmmentsmments andmmentsfordeffordEffordEffordEffordEffordEffordEffordEffordEddeScriptions.3)bestcractices.3)bestcracticesincracticesinclud

JavaScript評論:簡短說明 JavaScript評論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

JavaScript數(shù)據(jù)類型:深度潛水 JavaScript數(shù)據(jù)類型:深度潛水 Jun 13, 2025 am 12:10 AM

JavaScripthasseveralprimitivedatatypes:Number,String,Boolean,Undefined,Null,Symbol,andBigInt,andnon-primitivetypeslikeObjectandArray.Understandingtheseiscrucialforwritingefficient,bug-freecode:1)Numberusesa64-bitformat,leadingtofloating-pointissuesli

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

JavaScript:探索用於高效編碼的數(shù)據(jù)類型 JavaScript:探索用於高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

See all articles