成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文帶你學會SSE,你學會了嗎?

開發 前端
Server-Sent Events 是一種允許服務器向瀏覽器發送實時更新的技術。不同于WebSocket的全雙工通信方式,SSE更專注于單向的數據流,即從服務器到客戶端的數據推送。

隨著Web應用的不斷發展,實時數據傳輸的需求變得越來越普遍。傳統的輪詢方法不僅效率低下,而且在高并發情況下會對服務器造成不必要的壓力。為了解決這個問題,Server-Sent Events (SSE) 應運而生,它允許服務器端主動向客戶端推送更新。

Server-Sent Events

Server-Sent Events 是一種允許服務器向瀏覽器發送實時更新的技術。不同于WebSocket的全雙工通信方式,SSE更專注于單向的數據流,即從服務器到客戶端的數據推送。

這種方式對于需要實時更新的場景非常有用,當前主流的大模型平臺,比如ChatGPT、通義千問、文心一言,對話時采用的就是SSE。

SSE 本質是一個基于 http 協議的通信技術。

SSE的應用

引入依賴

spring-boot-starter-web 中默認已經引用了 sse,所以我們不需要額外引入其他依賴

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

基本用法

@RestController
public class SseController {

    @GetMapping("/sse")
    public SseEmitter handleSse() {
        SseEmitter emitter = new SseEmitter();

        // 異步處理發送事件
        new Thread(() -> {
            try {
                // 推送事件
                emitter.send("實時消息:你好!");
                Thread.sleep(1000);  // 模擬延時
                emitter.send("實時消息:更新來了!");
                emitter.complete(); // 結束推送
            } catch (Exception e) {
                emitter.completeWithError(e); // 異常處理
            }
        }).start();

        return emitter;
    }
}

客戶端代碼

const eventSource = new EventSource("/sse");

// 處理服務器推送的消息
eventSource.onmessage = function(event) {
    console.log(event.data);
};

// 處理連接關閉或錯誤
eventSource.onerror = function() {
    console.log("連接出現問題,自動重連...");
};

效果預覽

圖片圖片

為什么會這么多,那是因為客戶端的自動重連機制,無需我們手動維護,客戶端會自動發起重連。

SseEmitter

其實sse的核心,就是SseEmitter這個類,是 Spring 提供的一個類,用于處理 Server-Sent Events (SSE)。它允許服務器端以流的形式推送事件給客戶端,而不需要客戶端不斷輪詢服務器。

1.構造函數

  • SseEmitter():創建一個默認超時時間的 SseEmitter 實例。默認超時為 30 秒。
  • SseEmitter(Long timeout):創建一個帶有自定義超時時間的 SseEmitter 實例。

timeout:指定以毫秒為單位的超時時間。如果設置為 0L,則連接永遠不會超時。

2.核心方法

  • send(Object object):向客戶端發送一條消息。

object:要發送的數據,可以是任何類型的對象。

此方法會將數據直接發送到客戶端,并在響應體中流式返回。

  • send(SseEmitter.SseEventBuilder event):以事件構建器的形式發送一條消息。
  • SseEventBuilder 是用來構建發送事件的一個內部類,允許你自定義事件的各個屬性,如 id、data、name 等。

  • complete():表示 SSE 流完成并關閉連接。服務器告訴客戶端,事件流已經結束。

  • completeWithError(Throwable ex):在發生錯誤時關閉連接,并以錯誤的形式告知客戶端。

3.回調函數

  • onCompletion(Runnable callback):指定當 SSE 連接完成(正常關閉)時執行的回調函數。
  • onTimeout(Runnable callback):指定當連接超時時執行的回調函數。
  • onError(Consumer<Throwable> callback):指定當發生錯誤時執行的回調函數。這個錯誤可能是由于網絡連接問題、客戶端斷開等原因。

4.SseEventBuilder 內部類

SseEmitter.SseEventBuilder 是用于構建 SSE 事件的一個類,允許自定義事件的各個部分:

  • SseEmitter.event():返回一個新的 SseEventBuilder 實例,用于構建事件。
  • id(String id):設置事件的唯一標識符??蛻舳丝梢酝ㄟ^這個 ID 識別和處理事件。
  • name(String name):設置事件的名稱??蛻舳丝梢酝ㄟ^這個名稱識別不同類型的事件,SSE 響應中會顯示為 event: name。
  • data(Object data):設置要發送的數據??梢允俏谋尽SON 等類型,最終會在客戶端的 SSE 流中顯示為 data: xxx。
  • reconnectTime(long milliseconds):告訴客戶端在多少毫秒后嘗試重新連接。如果連接中斷,客戶端會在指定時間后自動重連。
  • comment(String comment):向客戶端發送一條注釋(不會觸發事件)。

目前 SseEmitter 是基于 每個客戶端請求獨立管理 的對象,因此不適合將其直接交由 Spring 管理為單例或共享對象。

每次請求應手動創建新的 SseEmitter 實例,并配置合適的超時時間。對于每個連接,SseEmitter 都是短暫的,使用完畢后應該調用 complete() 或 completeWithError() 方法來釋放資源。

SSE 與 WebSocket 對比

圖片圖片

小結

  • 相比輪詢,SSE 通過長連接減少了網絡開銷和服務器壓力。
  • SseEmitter 適用于需要服務器實時推送數據的場景,特別是實時通知、動態更新等需求
  • 相比websocket,在某些場景下,SSE 更加易用,且占用的資源較少
責任編輯:武曉燕 來源: Java技術指北
相關推薦

2023-03-10 22:08:20

2024-03-01 08:13:45

Shell編程解釋器

2024-10-28 00:00:03

IP屬地地址

2023-07-31 08:18:50

Docker參數容器

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2022-03-08 08:39:22

gRPC協議云原生

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2023-01-30 09:01:54

圖表指南圖形化

2024-07-31 08:39:45

Git命令暫存區

2024-08-06 09:47:57

2022-07-08 09:27:48

CSSIFC模型

2023-12-12 08:02:10

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2024-11-28 10:09:06

2023-01-28 09:50:17

java多線程代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产一区二区三区动漫 | 欧美日产国产成人免费图片 | 亚洲视频手机在线 | 91在线网| 一级黄色片一级黄色片 | 久久久网 | 91免费版在线观看 | 亚州春色 | 国产高清在线视频 | 自拍 亚洲 欧美 老师 丝袜 | www.男人天堂.com | 亚洲精品3 | 久久岛国| 91高清在线观看 | 久久亚洲精品国产精品紫薇 | 狠狠爱网址| 亚洲欧美一区二区在线观看 | 在线观看免费av网 | 国产高清在线 | 亚洲欧美综合精品另类天天更新 | 一级毛片色一级 | 人人干人人舔 | 日本三级电影在线免费观看 | 全部免费毛片在线播放网站 | 午夜二区| www.国产精| 成人在线 | 精品欧美一区二区在线观看 | 精品国产乱码久久久久久丨区2区 | 国产日韩一区二区三免费高清 | 日本激情视频中文字幕 | 国产精品国色综合久久 | 成人福利网站 | 天天操夜夜操 | 男人的天堂一级片 | 国产精品久久久久久久久久三级 | 久久精品色欧美aⅴ一区二区 | 久久久精| 久久9999久久 | 久久成人国产 | 日韩国产欧美在线观看 |