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

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

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

Feb 24, 2025 am 10:28 AM

Implementing Push Technology Using Server-Sent Events

核心要點

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

與 WebSockets 的比較

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

檢測支持

SSE 的支持度相對較高,Internet Explorer 是唯一一個尚不支持它們的 主要瀏覽器。但是,只要 IE 落后,就仍然需要提供功能檢測。在客戶端,SSE 使用 EventSource 對象實現(xiàn)——這是全局對象的一個屬性。以下函數(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ù)。以下示例顯示了一個通用的 onopen 事件處理程序。

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

EventSource 事件處理程序也可以使用 addEventListener() 方法編寫。此替代語法優(yōu)于 onopen,因為它允許多個處理程序附加到同一事件。以下使用 addEventListener() 重寫了之前的 onopen 事件處理程序。

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

接收消息

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

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

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

EventSource(url);

命名事件

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

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

處理錯誤

如果事件流出現(xiàn)問題,則會觸發(fā) EventSource 的 onerror 事件處理程序。錯誤的一個常見原因是連接中斷。盡管 EventSource 對象會自動嘗試重新連接到服務(wù)器,但在斷開連接時也會觸發(fā)錯誤事件。以下示例顯示了一個 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;
  // 處理消息
};

斷開連接

客戶端可以隨時通過調(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 屬性中。在其生命周期的任何時間點,連接都可以處于三種可能的狀態(tài)之一——連接中、打開和關(guān)閉。以下列表描述了每種狀態(tài)。

  • 連接中 – 創(chuàng)建 EventSource 對象時,它最初會進(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》。我還撰寫了一篇更實用的文章,介紹了 Node.js 中的 SSE。享受!

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

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

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

SSE 與 WebSockets 有何不同?

雖然 SSE 和 WebSockets 都提供實時數(shù)據(jù)更新,但它們的功能和用例有所不同。WebSockets 在客戶端和服務(wù)器之間提供雙向通信通道,允許雙方隨時發(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ī)范格式化數(shù)據(jù)。

如何處理 SSE 的連接錯誤或中斷?

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

我可以使用 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 用于多用戶實時應(yīng)用程序嗎?

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

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

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

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è)和移動應(yīng)用開發(fā),而JavaScript主要用于網(wǎng)頁開發(fā)。

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

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

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

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

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

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

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

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

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

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

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯誤處理。了解這兩個階段有助于精確控制JavaScript響應(yīng)用戶操作的時機(jī)和方式。

Java和JavaScript有什么區(qū)別? Java和JavaScript有什么區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。1.Java是靜態(tài)類型、編譯型語言,適用于企業(yè)應(yīng)用和大型系統(tǒng)。2.JavaScript是動態(tài)類型、解釋型語言,主要用于網(wǎng)頁交互和前端開發(fā)。

See all articles