最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用SSE流式輸出實(shí)戰(zhàn)記錄(Javaweb前后端)

 更新時(shí)間:2025年05月07日 11:07:14   作者:記得開(kāi)心一點(diǎn)嘛  
這篇文章主要介紹了使用SSE流式輸出(Javaweb前后端)的相關(guān)資料,SSE是一種允許服務(wù)器向客戶端推送實(shí)時(shí)數(shù)據(jù)的技術(shù),適用于聊天應(yīng)用、實(shí)時(shí)數(shù)據(jù)監(jiān)控等場(chǎng)景,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一.什么是SSE?

SSE(Server-Sent Events)是一種在Web應(yīng)用中實(shí)現(xiàn)單向?qū)崟r(shí)通信的技術(shù)。通過(guò)SSE,服務(wù)器可以主動(dòng)向客戶端發(fā)送更新,而無(wú)需客戶端不斷發(fā)起請(qǐng)求。這對(duì)于需要實(shí)時(shí)更新的應(yīng)用場(chǎng)景(如聊天應(yīng)用、實(shí)時(shí)數(shù)據(jù)監(jiān)控等)非常有用。(服務(wù)端單向傳輸客戶端,長(zhǎng)連接)

主要特點(diǎn):

  • 單向通信:數(shù)據(jù)從服務(wù)器流向客戶端,客戶端不能直接向服務(wù)器發(fā)送數(shù)據(jù)。
  • 基于HTTP:SSE使用HTTP協(xié)議,簡(jiǎn)單易用,支持瀏覽器。
  • 自動(dòng)重連:如果連接丟失,瀏覽器會(huì)自動(dòng)嘗試重連。
  • 文本格式:數(shù)據(jù)以文本流的形式發(fā)送,通常是UTF-8編碼。

使用場(chǎng)景:頻繁的更新數(shù)據(jù),低延遲,單向通信

二.SSE的實(shí)現(xiàn)過(guò)程:

首先前端給后端發(fā)送請(qǐng)求,隨后后端會(huì)返回響應(yīng)文本流創(chuàng)建連接,然后后端就可以持續(xù)的長(zhǎng)連接進(jìn)行給前端傳輸數(shù)據(jù)。 

SSE 基于 HTTP 協(xié)議,利用了其長(zhǎng)連接特性,通過(guò)瀏覽器向服務(wù)器發(fā)送一個(gè) HTTP 請(qǐng)求,建立一條持久化的連接。SSE 可以傳輸文本和二進(jìn)制格式的數(shù)據(jù),但只支持單向數(shù)據(jù)流,即只能由服務(wù)器向客戶端推送數(shù)據(jù)。

三.SSE的前端實(shí)現(xiàn):

1.創(chuàng)建 EventSource 對(duì)象:

通過(guò)指定服務(wù)器端的SSE URL,創(chuàng)建一個(gè)EventSource實(shí)例。

const eventSource = new EventSource('http://localhost:8080/sse/chat');

2.處理接收到的信息:

使用onmessage事件處理程序接收服務(wù)器發(fā)送的消息。

eventSource.onmessage = function(event) {
    console.log('Received:', event.data);
    // 在這里處理接收到的數(shù)據(jù),比如更新UI
};

接收到的event是一個(gè)MessageEvent對(duì)象,它包含以下重要屬性:

  • data:這是服務(wù)器發(fā)送的消息內(nèi)容,通常是文本或JSON字符串。
  • origin:表示事件來(lái)源的URI,通常是服務(wù)器的URL。
  • lastEventId:如果瀏覽器重新連接,它會(huì)包含最后接收到的事件ID,這在處理丟失消息時(shí)非常有用。
eventSource.onmessage = function(event) {
    // event.data的結(jié)果假設(shè)是 '{"name": "Alice", "age": 25}'
    console.log('Received:', event.data); 
    // 如果是JSON格式,解析后 message 是一個(gè)對(duì)象: { name: "Alice", age: 25 }
    const message = JSON.parse(event.data); 
    // 在這里更新UI或進(jìn)行其他操作
};

 SSE發(fā)送的數(shù)據(jù)是以文本流的形式傳輸?shù)?,通常是字符串(例如,JSON格式的字符串)。如果服務(wù)器發(fā)送的是JSON格式的字符串(例如 {"key": "value"}),那么你可以使用 JSON.parse() 將這個(gè)字符串轉(zhuǎn)換為JavaScript對(duì)象,以便更方便地訪問(wèn)數(shù)據(jù)。

3.處理特定事件:

如果服務(wù)器發(fā)送了不同類(lèi)型的事件,可以使用oneventname處理特定事件。

eventSource.addEventListener('customEvent', function(event) {
    console.log('Custom event received:', event.data);
});

4.處理連接錯(cuò)誤問(wèn)題:

可以使用onerror事件處理程序來(lái)處理連接錯(cuò)誤。

eventSource.onerror = function(event) {
    console.error('EventSource failed:', event);
    // 可以在這里實(shí)現(xiàn)重連邏輯
};

5.關(guān)閉連接:

如果不再需要接收消息,可以通過(guò)調(diào)用close方法來(lái)關(guān)閉連接。

eventSource.close();

四.SSE的后端實(shí)現(xiàn):

1.導(dǎo)入web依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.創(chuàng)建Controller類(lèi):

package com.itheima.bigdealboot.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/sse")
@Slf4j
public class SSEController {
    
    @GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter sseChat(){
        SseEmitter emitter = new SseEmitter();

        // 創(chuàng)建一個(gè)定時(shí)任務(wù)
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        executor.scheduleAtFixedRate(() -> {
            try {
                // 發(fā)送當(dāng)前時(shí)間戳
                emitter.send(System.currentTimeMillis());
            } catch (IOException e) {
                // 處理異常(如客戶端關(guān)閉連接)
                emitter.completeWithError(e);
            }
        }, 0, 1, TimeUnit.SECONDS); // 每秒發(fā)送一次

        // 處理連接關(guān)閉
        emitter.onCompletion(() -> executor.shutdown());
        emitter.onTimeout(() -> {
            emitter.complete();
            executor.shutdown();
        });

        return emitter; // 返回SseEmitter實(shí)例
    }
}
  • SseEmitter實(shí)例:創(chuàng)建SseEmitter對(duì)象,準(zhǔn)備向前端發(fā)送事件。
  • 定時(shí)任務(wù):使用ScheduledExecutorService定期發(fā)送數(shù)據(jù)(如當(dāng)前時(shí)間戳)。如果發(fā)送失?。ɡ纾蛻舳岁P(guān)閉連接),則調(diào)用completeWithError()處理異常。
  • 連接關(guān)閉處理
    • onCompletion():當(dāng)連接正常關(guān)閉時(shí)調(diào)用,執(zhí)行資源清理。
    • onTimeout():在連接超時(shí)時(shí)關(guān)閉連接。

3.SeeEmitter的介紹以及使用方法:

SseEmitter 是 Spring框架提供的一個(gè)類(lèi),用于支持 Server-Sent Events (SSE)。

(1). 構(gòu)造方法

  • SseEmitter():創(chuàng)建一個(gè)新的 SseEmitter 實(shí)例,使用默認(rèn)的超時(shí)值。
  • SseEmitter(Long timeout):創(chuàng)建一個(gè)新的 SseEmitter 實(shí)例,設(shè)置指定的超時(shí)時(shí)間(毫秒)。

(2). 發(fā)送數(shù)據(jù)

  • send(Object data):發(fā)送數(shù)據(jù)到客戶端。
  • send(Object data, MediaType mediaType):發(fā)送數(shù)據(jù)到客戶端,并指定數(shù)據(jù)的媒體類(lèi)型。
  • send(SseEvent event):發(fā)送一個(gè) SseEvent 對(duì)象到客戶端。

(3). 關(guān)閉連接

  • complete():正常完成事件流,關(guān)閉連接。
  • completeWithError(Throwable throwable):由于錯(cuò)誤完成事件流,并關(guān)閉連接。
  • completeWithError(String message):由于錯(cuò)誤完成事件流,并關(guān)閉連接,提供錯(cuò)誤信息。

(4). 連接狀態(tài)處理

  • onCompletion(Runnable callback):注冊(cè)連接完成的回調(diào)函數(shù)。
  • onTimeout(Runnable callback):注冊(cè)連接超時(shí)的回調(diào)函數(shù)。

(5). 獲取超時(shí)時(shí)間

  • getTimeout():返回當(dāng)前的超時(shí)時(shí)間(毫秒)。

(6). 其他

  • isCompleted():檢查 SseEmitter 是否已完成。
  • isExpired():檢查 SseEmitter 是否已過(guò)期。

總結(jié) 

到此這篇關(guān)于使用SSE流式輸出(Javaweb前后端)的文章就介紹到這了,更多相關(guān)Javaweb前后端SSE流式輸出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法

    Spring整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法

    下面小編就為大家?guī)?lái)一篇Spring整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • JavaWEB SMBMS實(shí)現(xiàn)密碼修改功能過(guò)程

    JavaWEB SMBMS實(shí)現(xiàn)密碼修改功能過(guò)程

    本文介紹了實(shí)現(xiàn)密碼修改功能的步驟,包括前端頁(yè)面、Dao層、Service層和Servlet層的編寫(xiě)和調(diào)用,通過(guò)這些步驟,可以實(shí)現(xiàn)用戶密碼的修改功能
    2026-02-02
  • Java中Arrays類(lèi)和Collections類(lèi)常用方法示例詳解

    Java中Arrays類(lèi)和Collections類(lèi)常用方法示例詳解

    本文總結(jié)了Java中Arrays和Collections類(lèi)的常用方法,涵蓋數(shù)組填充、排序、搜索、復(fù)制、列表轉(zhuǎn)換等操作,幫助開(kāi)發(fā)者高效處理集合與數(shù)組數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧
    2025-07-07
  • 淺談在eclipse中如何修改svn的用戶名和密碼

    淺談在eclipse中如何修改svn的用戶名和密碼

    這篇文章主要介紹了在eclipse中如何修改svn的用戶名和密碼的方法,在eclipse中經(jīng)常用svn進(jìn)行代碼版本控制,提交或更新代碼的時(shí)候需要我們輸入用戶名和密碼。對(duì)此感興趣的話可以來(lái)了解一下
    2020-07-07
  • java中string.trim()函數(shù)的作用實(shí)例及源碼

    java中string.trim()函數(shù)的作用實(shí)例及源碼

    這篇文章主要介紹了java中string.trim()函數(shù)的作用實(shí)例及源碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • PageHelper在springboot+mybatis框架中的使用步驟及原理解析

    PageHelper在springboot+mybatis框架中的使用步驟及原理解析

    這篇文章主要介紹了PageHelper在springboot+mybatis框架中的使用步驟及原理解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • java 解決異常 2 字節(jié)的 UTF-8 序列的字節(jié)2 無(wú)效的問(wèn)題

    java 解決異常 2 字節(jié)的 UTF-8 序列的字節(jié)2 無(wú)效的問(wèn)題

    這篇文章主要介紹了java 解決異常 2 字節(jié)的 UTF-8 序列的字節(jié) 2 無(wú)效的問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解

    Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解

    在Java中List是一種常用的集合類(lèi),用于存儲(chǔ)一組元素,List提供了多種遍歷元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法,這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.foreach()和list.stream().foreach()用法的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • java下使用kaptcha生成驗(yàn)證碼

    java下使用kaptcha生成驗(yàn)證碼

    這篇文章主要介紹了java下使用kaptcha生成驗(yàn)證碼,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Spring?Boot?整合持久層之Spring Data JPA

    Spring?Boot?整合持久層之Spring Data JPA

    在介紹Spring Data JPA的時(shí)候,我們首先認(rèn)識(shí)下Hibernate。Hibernate是數(shù)據(jù)訪問(wèn)解決技術(shù)的絕對(duì)霸主,使用O/R映射技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn),O/R映射即將領(lǐng)域模型類(lèi)和數(shù)據(jù)庫(kù)的表進(jìn)行映射,通過(guò)程序操作對(duì)象而實(shí)現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問(wèn)操作無(wú)須關(guān)注數(shù)據(jù)庫(kù)相關(guān)的技術(shù)
    2022-08-08

最新評(píng)論

同江市| 定陶县| 罗定市| 巴马| 安徽省| 江口县| 剑川县| 平江县| 平南县| 新野县| 建阳市| 平遥县| 松滋市| 溧阳市| 赣州市| 沈阳市| 龙井市| 永宁县| 保亭| 双桥区| 安塞县| 安多县| 茌平县| 金平| 泊头市| 和平县| 高阳县| 胶州市| 潮安县| 印江| 自治县| 四子王旗| 灵寿县| 武汉市| 仁怀市| 石家庄市| 洪江市| 宝鸡市| 乌兰察布市| 射阳县| 天祝|