LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【JavaScript】EventSource實(shí)現(xiàn)服務(wù)端與客戶(hù)端通信案例實(shí)戰(zhàn)

admin
2024年6月15日 11:9 本文熱度 1182

項(xiàng)目需求:數(shù)據(jù)展示實(shí)時(shí)更新
解決方案:在第一時(shí)間想到的是通過(guò)前端輪詢(xún)的方式請(qǐng)求后端接口,達(dá)到數(shù)據(jù)更新的目的,但是存在以下缺點(diǎn)

  1. 數(shù)據(jù)不能做到實(shí)施更新,有一定時(shí)間的延遲

  2. 消耗大量的系統(tǒng)資源

優(yōu)化方案:使用EventSource的方式來(lái)實(shí)現(xiàn)該需求,能夠解決以上問(wèn)題


目錄

1. EventSource基本介紹

2. EventSource特性

3. EventSource工作原理

4. EventSource常用方法

5. 實(shí)戰(zhàn)案例:Vue+SpringBoot


1. EventSource基本介紹

        EventSource是一種用于實(shí)現(xiàn)服務(wù)器推送事件的Web API,它允許服務(wù)器向客戶(hù)端發(fā)送數(shù)據(jù)流,而無(wú)需客戶(hù)端發(fā)出請(qǐng)求。EventSource架構(gòu)的設(shè)計(jì)思想是建立一種持久連接,通過(guò)這個(gè)連接發(fā)送事件流,以實(shí)現(xiàn)通信。       

2. EventSource特性

  1. 實(shí)時(shí)性。EventSource能夠?qū)崿F(xiàn)實(shí)時(shí)地?cái)?shù)據(jù)傳輸,可以在服務(wù)器端有新事件時(shí)立即向客戶(hù)端推送,并自動(dòng)進(jìn)行展示。

  2. 低延遲。由于EventSource采用長(zhǎng)連接的方式進(jìn)行傳輸,相比于普通的輪詢(xún)方式,它能夠更加高效地傳輸數(shù)據(jù)。

  3. 易用性。EventSource是一種非常易用的API,只需要在客戶(hù)端創(chuàng)建一個(gè)EventSource對(duì)象,指定服務(wù)器端的URL,即可進(jìn)行監(jiān)聽(tīng)并展示事件。

  4. 兼容性。EventSource能夠同時(shí)兼容WebSocket和長(zhǎng)輪詢(xún)等方式,具備很好的兼容性,可以在各種不同的場(chǎng)景下使用。

3. EventSource工作原理

        EventSource的原理基于Http協(xié)議,它允許服務(wù)器與客戶(hù)端建立持久的連接,以便服務(wù)器能夠向客戶(hù)端推送事件數(shù)據(jù)。以下是EventSource的工作原理客戶(hù)端發(fā)起請(qǐng)求:客戶(hù)端通過(guò)創(chuàng)建一個(gè)EventSource對(duì)象,并向服務(wù)器發(fā)起一個(gè)HTTP GET請(qǐng)求,請(qǐng)求一個(gè)特定的URL。

  1. 服務(wù)器響應(yīng):服務(wù)器接收客戶(hù)端的請(qǐng)求,并在HTTP頭中添加Content-Type: text/event-stream,表明將發(fā)送的事件數(shù)據(jù)格式為text/event-stream。

  2. 建立持久連接:服務(wù)器與客戶(hù)端建立一個(gè)持續(xù)的HTTP連接,并開(kāi)始向客戶(hù)端發(fā)送數(shù)據(jù),直到連接被關(guān)閉。

  3. 發(fā)送事件數(shù)據(jù):當(dāng)服務(wù)器有新的事件數(shù)據(jù)要發(fā)送時(shí),它將按照特定格式發(fā)送給客戶(hù)端。事件數(shù)據(jù)通常以event:eventName;data:eventData;的形式發(fā)送,其中event字段表示事件名,data字段表示事件數(shù)據(jù)。

  4. 客戶(hù)端接收數(shù)據(jù):客戶(hù)端通過(guò)EventSource對(duì)象注冊(cè)事件處理函數(shù),以接收來(lái)自服務(wù)器的事件數(shù)據(jù)。當(dāng)接收到事件數(shù)據(jù)時(shí),客戶(hù)端會(huì)創(chuàng)建一個(gè)Event對(duì)象,并觸發(fā)相應(yīng)的事件處理函數(shù),傳遞Event對(duì)象作為參數(shù)。Event對(duì)象包含type(事件類(lèi)型,通常為"message")、data(事件數(shù)據(jù))、lastEventId(上一個(gè)事件的ID)、origin(事件源的URL)等屬性。

  5. 錯(cuò)誤處理和重連:如果連接出現(xiàn)錯(cuò)誤或被關(guān)閉,客戶(hù)端將觸發(fā)“error”事件或“close”事件,以便進(jìn)行錯(cuò)誤處理或重新連接。

  6. 單向通信:EventSource支持單向通信,即只能從服務(wù)器向客戶(hù)端推送數(shù)據(jù),不支持客戶(hù)端向服務(wù)器發(fā)送數(shù)據(jù)。這種特性使它適用于需要實(shí)時(shí)更新的應(yīng)用程序場(chǎng)景,如聊天室、股票市場(chǎng)等。

  7. 自動(dòng)重連接:EventSource支持自動(dòng)重連接功能,如果連接中斷,它可以嘗試自動(dòng)恢復(fù)連接。

  8. 發(fā)送隨機(jī)事件:EventSource允許服務(wù)器發(fā)送沒(méi)有明確事件名的隨機(jī)事件,這種情況下,如果沒(méi)有指定事件名的匹配事件處理函數(shù),則會(huì)觸發(fā)通用事件處理函數(shù)。

        總的來(lái)說(shuō),EventSource提供了一種簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)服務(wù)器向客戶(hù)端的實(shí)時(shí)數(shù)據(jù)推送,特別適合于不需要雙向通信的場(chǎng)景。

4. EventSource常用方法

        1. 創(chuàng)建EventSource對(duì)象,其中url是服務(wù)器端推送數(shù)據(jù)的地址。

var evtSource = new EventSource(url);

        2.  onopen:連接建立時(shí)觸發(fā)

  1. evtSource.onopen = function () {
  2. console.log("Connection to server opened.");
  3. };

        3. onmessage:接收到服務(wù)器端發(fā)送的數(shù)據(jù)時(shí)觸發(fā)。

  1. evtSource.onmessage = (e) => {
  2. console.log(e.data)
  3. };

        4. onerror:連接出錯(cuò)時(shí)觸發(fā)。

  1. evtSource.onerror = function () {
  2. console.log("連接失敗");
  3. };

5. 實(shí)戰(zhàn)案例:Vue+SpringBoot

前端代碼:

methods: {

        handleEventSoure() {

            const eventSource = new EventSource('/source/test') // 連接地址

            eventSource.onopen = () => { // 開(kāi)始連接

                console.log("連接成功")

            }

            eventSource.onmessage = (event) => { // 接收消息

                console.log(event.data)

            }

            eventSource.onerror = () => { // 連接失敗

                console.log("連接失敗")

            }

        },

   },

mounted() {

    this.handleEventSoure()

}

后端代碼:

@RestController

@RequestMapping("/source")

public class SysLoginInfoController extends BaseController {

    @GetMapping("/test")

    public Flux<String> test(HttpServletResponse response, HttpServletRequest req) {

        //設(shè)置響應(yīng)的內(nèi)容類(lèi)型為HTML,字符集為UTF-8。

        response.setContentType("text/html;charset=utf-8");

        // 設(shè)置響應(yīng)頭,指明這是一個(gè)EventSource響應(yīng)

        response.setHeader("Content-Type", "text/event-stream");

        //設(shè)置響應(yīng)頭"Cache-Control"為"no-cache",表示不允許緩存此響應(yīng)。

        response.setHeader("Cache-Control", "no-cache");

        //設(shè)置響應(yīng)頭"Connection"為"keep-alive",表示保持連接。

        response.setHeader("Connection", "keep-alive");

        //返回的是一個(gè)字符串流 返回?cái)?shù)據(jù):好的 + 當(dāng)前時(shí)間

        return Flux.interval(Duration.ofSeconds(1)).map(sequence -> "data: 好的" + new Date() + "");

    }

}

效果展示:

至此大功告成。


該文章在 2024/6/15 11:13:24 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
一区二区三区高清aⅴ专区 三级网站免在线看 | 欧美激情一区在线观看 | 亚洲天堂午夜影院在线观看 | 日韩激情视频久久 | 亚洲h成年动漫在线观看不卡 | 理论片第一页一区二区 |