亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

實(shí)時(shí)通信的服務(wù)器推送機(jī)制 EventSource(SSE) 簡(jiǎn)介附go實(shí)現(xiàn)示例代碼

 更新時(shí)間:2024年03月30日 09:47:02   作者:Grassto  
EventSource是一種非常有用的 API,適用于許多實(shí)時(shí)應(yīng)用場(chǎng)景,它提供了一種簡(jiǎn)單而可靠的方式來(lái)建立服務(wù)器推送連接,并實(shí)現(xiàn)實(shí)時(shí)更新和通知,這篇文章主要介紹了實(shí)時(shí)通信的服務(wù)器推送機(jī)制 EventSource(SSE)簡(jiǎn)介附go實(shí)現(xiàn)示例,需要的朋友可以參考下

簡(jiǎn)介

不知道大家有沒(méi)有見(jiàn)過(guò) Content-Type:text/event-stream 的請(qǐng)求頭,這是 HTML5 中的 EventSource 是一項(xiàng)強(qiáng)大的 API,通過(guò)服務(wù)器推送實(shí)現(xiàn)實(shí)時(shí)通信。

WebSocket 相比,EventSource 提供了一種簡(jiǎn)單而可靠的單向通信機(jī)制(服務(wù)器->客戶端),實(shí)現(xiàn)簡(jiǎn)單,適用于許多實(shí)時(shí)應(yīng)用場(chǎng)景。

本文將介紹 EventSource 的簡(jiǎn)單使用、與 WebSocket 的對(duì)比以及其優(yōu)缺點(diǎn),最后對(duì)其進(jìn)行總結(jié)。

EventSource

客戶端從服務(wù)端訂閱一條“流”,之后服務(wù)端可以發(fā)送消息給客戶端直到服務(wù)端或者客戶端關(guān)閉該“流”,所以 EventSource 也叫作 SSE(server-sent-event)。

  • EventSourceHTML5 中的一項(xiàng) API,用于在客戶端和服務(wù)器之間建立持久的、單向的通信連接。
  • 它基于 HTTP 協(xié)議,通過(guò)服務(wù)器推送的方式向客戶端發(fā)送實(shí)時(shí)事件通知。
  • 客戶端通過(guò)添加事件偵聽(tīng)器來(lái)捕獲事件并執(zhí)行相應(yīng)的操作。

簡(jiǎn)單使用

示例:
服務(wù)器端使用 Go 創(chuàng)建了一個(gè)路由 /events,當(dāng)客戶端通過(guò) EventSource 對(duì)象連接到該路由時(shí),服務(wù)器會(huì)不斷地發(fā)送事件流(每隔2秒發(fā)送一個(gè)事件)。客戶端的 HTML 頁(yè)面中使用 JavaScript 創(chuàng)建了一個(gè) EventSource 對(duì)象,通過(guò) onmessage 事件,將接收到的事件數(shù)據(jù)添加到頁(yè)面中。如果發(fā)生錯(cuò)誤,客戶端會(huì)關(guān)閉 EventSource 連接。

文件結(jié)構(gòu)如下

程序目錄
	- main.go
	- c1.html

go 服務(wù)

package main
import (
	"fmt"
	"gopkg.in/antage/eventsource.v1"
	"log"
	"net/http"
	"time"
)
func main() {
	es := eventsource.New(nil, nil)
	defer es.Close()
	http.Handle("/", http.FileServer(http.Dir("./")))
	http.Handle("/events", es)
	go func() {
		for {
			// 每2秒發(fā)送一條當(dāng)前時(shí)間消息,并打印對(duì)應(yīng)客戶端數(shù)量
			es.SendEventMessage(fmt.Sprintf("hello, now is: %s", time.Now()), "", "")
			log.Printf("Hello has been sent (consumers: %d)", es.ConsumersCount())
			time.Sleep(2 * time.Second)
		}
	}()
	log.Println("Open URL http://localhost:8080/ in your browser.")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal(err)
	}
}

前端 HTML

<!DOCTYPE html>
<html>
<head>
    <title>SSE test</title>
    <script type="text/javascript">
        window.addEventListener("DOMContentLoaded", function () {
            var evsrc = new EventSource("http://localhost:8080/events");
            var msgEvent = function (ev) {
                document.getElementById("log")
                    .insertAdjacentHTML("beforeend", "<li>" + ev.data + "</li>");
            }
			evsrc.onmessage = msgEvent;
			//evsrc.addEventListener("message", msgEvent)
            evsrc.onerror = function (ev) {
                console.log("readyState = " + ev.currentTarget.readyState);
            }
        })
    </script>
</head>
<body>
<h1>SSE test</h1>
<div>
    <ul id="log">
    </ul>
</div>
</body>
</html>

服務(wù)啟動(dòng)后訪問(wèn) http://localhost:8080/c1.html 可見(jiàn)如下頁(yè)面

在這里插入圖片描述

和 websocket 的對(duì)比

EventSource 的優(yōu)點(diǎn)

  • 簡(jiǎn)單易用:EventSource 使用簡(jiǎn)單,基于標(biāo)準(zhǔn)的 HTTP 協(xié)議,無(wú)需復(fù)雜的握手過(guò)程。
  • 自動(dòng)重連:EventSource 具有內(nèi)置的重連機(jī)制,確保連接中斷后自動(dòng)重新連接。
  • 輕量級(jí):EventSource 使用長(zhǎng)輪詢機(jī)制,消耗的資源相對(duì)較少,適合低帶寬環(huán)境。
  • 跨域支持:EventSource 允許在跨域環(huán)境下進(jìn)行通信,通過(guò)適當(dāng)?shù)捻憫?yīng)頭授權(quán)來(lái)自不同域的客戶端連接。

EventSource 的缺點(diǎn)

  • 單向通信:EventSource 只支持服務(wù)器向客戶端的單向通信,無(wú)法實(shí)現(xiàn)客戶端向服務(wù)器的實(shí)時(shí)交互。
  • 較低的瀏覽器支持:盡管現(xiàn)代瀏覽器廣泛支持 EventSource,但在一些較舊的瀏覽器中可能不完全支持。

WebSocket 的優(yōu)點(diǎn)

  • 雙向通信:WebSocket 支持全雙工通信,客戶端和服務(wù)器可以在同一連接上進(jìn)行雙向數(shù)據(jù)交換。
  • 實(shí)時(shí)性和效率:WebSocket 具有低延遲和高效性能,適用于需要快速、實(shí)時(shí)響應(yīng)的應(yīng)用。
  • 大規(guī)模應(yīng)用:WebSocket適用于復(fù)雜的、大規(guī)模的實(shí)時(shí)應(yīng)用,如在線游戲、協(xié)同編輯等。

WebSocket 的缺點(diǎn)

  • 復(fù)雜性:WebSocket協(xié)議的握手過(guò)程相對(duì)復(fù)雜,需要服務(wù)器和客戶端實(shí)現(xiàn)特定的協(xié)議邏輯。
  • 難以穿越防火墻和代理服務(wù)器:WebSocket的特殊協(xié)議可能會(huì)受到防火墻和代理服務(wù)器的限制。

總結(jié)

EventSourceHTML5 中一個(gè)強(qiáng)大的 API,提供了簡(jiǎn)單可靠的服務(wù)器推送機(jī)制,用于實(shí)現(xiàn)實(shí)時(shí)通信。

WebSocket 相比,EventSource 的優(yōu)勢(shì)在于其簡(jiǎn)單易用、自動(dòng)重連、輕量級(jí)和跨域支持。然而,它也有一些限制,如單向通信和較低的瀏覽器支持。相比之下,WebSocket 適用于雙向通信、大規(guī)模應(yīng)用和實(shí)時(shí)性要求較高的場(chǎng)景,但其復(fù)雜性和穿越防火墻的挑戰(zhàn)也需要考慮。

總的來(lái)說(shuō),EventSource 是一種非常有用的 API,適用于許多實(shí)時(shí)應(yīng)用場(chǎng)景,如實(shí)時(shí)股票報(bào)價(jià)、即時(shí)聊天、實(shí)時(shí)通知等。它提供了一種簡(jiǎn)單而可靠的方式來(lái)建立服務(wù)器推送連接,并實(shí)現(xiàn)實(shí)時(shí)更新和通知。如果應(yīng)用程序只需要服務(wù)器向客戶端單向推送數(shù)據(jù),EventSource 是一個(gè)不錯(cuò)的選擇。然而,如果需要雙向通信或更高級(jí)的實(shí)時(shí)功能,WebSocket 可能更適合。

參考

Mozilla Developer Network (MDN) - EventSource

Stream Updates with Server-Sent Events

到此這篇關(guān)于實(shí)時(shí)通信的服務(wù)器推送機(jī)制 EventSource(SSE) 簡(jiǎn)介 附 go 實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)EventSource服務(wù)器推送機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Go語(yǔ)言玩轉(zhuǎn) RESTful API 服務(wù)

    使用Go語(yǔ)言玩轉(zhuǎn) RESTful API 服務(wù)

    RESTful API是一種基于HTTP協(xié)議的API設(shè)計(jì)風(fēng)格,遵循REST架構(gòu)風(fēng)格,這篇文章主要為大家介紹了如何通過(guò)Go語(yǔ)言構(gòu)建RESTful API服務(wù),有需要的可以了解下
    2025-02-02
  • golang中命令行庫(kù)cobra的使用方法示例

    golang中命令行庫(kù)cobra的使用方法示例

    這篇文章主要給大家介紹了關(guān)于golang中命令行庫(kù)cobra的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • golang中定時(shí)器cpu使用率高的現(xiàn)象詳析

    golang中定時(shí)器cpu使用率高的現(xiàn)象詳析

    這篇文章主要給大家介紹了關(guān)于golang中定時(shí)器cpu使用率高的現(xiàn)象的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • golang結(jié)構(gòu)體與json格式串實(shí)例代碼

    golang結(jié)構(gòu)體與json格式串實(shí)例代碼

    本文通過(guò)實(shí)例代碼給大家介紹了golang結(jié)構(gòu)體與json格式串的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Go prometheus metrics條目自動(dòng)回收與清理方法

    Go prometheus metrics條目自動(dòng)回收與清理方法

    這篇文章主要為大家介紹了Go prometheus metrics條目自動(dòng)回收與清理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • go語(yǔ)言處理JSON和XML數(shù)據(jù)示例解析

    go語(yǔ)言處理JSON和XML數(shù)據(jù)示例解析

    這篇文章主要介紹了go語(yǔ)言處理JSON和XML數(shù)據(jù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 教你一分鐘配置好Go語(yǔ)言開(kāi)發(fā)環(huán)境(多種操作系統(tǒng))

    教你一分鐘配置好Go語(yǔ)言開(kāi)發(fā)環(huán)境(多種操作系統(tǒng))

    在這篇文章中,我們從頭到尾一步步指導(dǎo)你配置Golang開(kāi)發(fā)環(huán)境,并編寫(xiě)你的第一個(gè)"Hello,?World!"程序,我們?cè)敿?xì)解釋了在多種操作系統(tǒng)(包括Windows、Linux和macOS)下的安裝過(guò)程、環(huán)境變量設(shè)置以及如何驗(yàn)證安裝是否成功
    2023-09-09
  • Go內(nèi)置零值標(biāo)識(shí)符zero

    Go內(nèi)置零值標(biāo)識(shí)符zero

    大家學(xué)習(xí)和使用?Go?語(yǔ)言時(shí),有一個(gè)神奇的概念:零值(zero-values),所以本文想給大家分享一個(gè)關(guān)于零值的新提案,目測(cè)已經(jīng)八九不離十了
    2023-08-08
  • golang操作連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)mysql事務(wù)示例

    golang操作連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)mysql事務(wù)示例

    這篇文章主要為大家介紹了golang操作連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)mysql事務(wù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 詳解golang中bufio包的實(shí)現(xiàn)原理

    詳解golang中bufio包的實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解golang中bufio包的實(shí)現(xiàn)原理,通過(guò)分析golang中bufio包的源碼,來(lái)了解為什么bufio能夠提高文件讀寫(xiě)的效率和速度
    2018-01-01

最新評(píng)論