国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

實時數據推送并非只有WebSocket一種選擇

開發 前端
默認是“message”事件,因為它可以捕獲沒有 event 字段的事件, * 以及具有特定類型 `event:message` 的事件。* 它不會觸發任何其他類型的事件。

環境:SpringBoot2.7.16

概述

在Web應用中,有幾種實時數據推送的選擇方案,包括SSE(Server-Sent Events)、WebSocket、長輪詢等。

SSE是一種基于HTTP協議的服務器向客戶端推送數據的技術。它的優點是實現簡單、輕量級,對現有服務器軟件兼容性好。但是,由于SSE是單向通信模型,只能由服務器向客戶端推送數據,對于需要客戶端向服務器發送數據的場景,SSE就無法滿足需求。

WebSocket是一種雙向通信模型,允許客戶端和服務器之間互相發送消息。它的優點是實時性強、延遲低,但是需要服務器端支持對應的協議棧,實現起來相對復雜一些。

長輪詢是對短輪詢的一種改進版本,通過在盡可能減少對服務器資源浪費的同時,保證消息的相對實時性。長輪詢在客戶端發起請求時,服務器會保持連接打開,等待一定時間后再返回響應。這樣可以減少客戶端頻繁的請求,節省帶寬和服務器資源。但是,如果服務器沒有新的消息產生,客戶端會一直等待響應,實時性就會受到一定影響。

根據實際應用場景和需求,可以選擇適合的實時數據推送方案。如果只需要服務器向客戶端推送數據,且對實時性要求不是特別高,可以選擇SSE。如果需要客戶端向服務器發送數據,或者對實時性要求較高,可以選擇WebSocket或長輪詢。當然,也可以根據實際情況將這幾種方案結合起來使用,以滿足不同的需求。

SSE與WebSocket對比

SSE(Server-Sent Events)和WebSocket都是用于實現實時通信的技術,存在關鍵差異。

通信模型:SSE是單向通信模型,只能由服務器向客戶端推送數據。而WebSocket是雙向通信模型,客戶端和服務器可以互相發送消息。

連接性:SSE使用長輪詢或HTTP流技術,需要頻繁地發起HTTP請求來獲取數據。而 WebSocket只需在握手階段建立一次連接,然后保持連接打開,減少了頻繁建立連接的開銷。

實時性:WebSocket提供了更低的延遲和更高的實時性,因為它支持雙向通信,可以立即將數據推送給客戶端。SSE雖然也可以實現實時性,但由于其單向通信模型,需要服務器定期發送數據。

協議特性:SSE是部署在HTTP協議之上的,現有的服務器軟件都支持。而WebSocket是一個新的協議,需要服務器端支持對應的協議棧。

復雜性:SSE相對WebSocket來說更輕量級,實現更簡單。WebSocket協議較復雜,實現相對困難一些。

總體來說,SSE和WebSocket都有各自的優點和適用場景。SSE輕量級且對現有服務器軟件兼容性好,而WebSocket則提供了更強的雙向通信能力和更高的實時性。

SSE簡介

SSE(Server-Sent Events)是一種用于實現服務器向客戶端實時推送數據的Web技術。與傳統的輪詢和長輪詢相比,SSE提供了更高效和實時的數據推送機制。

SSE基于HTTP協議,允許服務器將數據以事件流(Event Stream)的形式發送給客戶端。客戶端通過建立持久的HTTP連接,并監聽事件流,可以實時接收服務器推送的數據。

SSE的主要特點包括:

簡單易用:SSE使用基于文本的數據格式,如純文本、JSON等,使得數據的發送和解析都相對簡單。

單向通信:SSE支持服務器向客戶端的單向通信,服務器可以主動推送數據給客戶端。

實時性:SSE建立長時間的連接,使得服務器可以實時地將數據推送給客戶端,而無需客戶端頻繁地發起請求。

服務端開發

依賴管理

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

配置文件

spring:
  mvc:
    static-path-pattern: /**
  web:
    resources:
      #靜態文件目錄index.html
      static-locations: classpath:/templates/

接口開發

@RestController
@RequestMapping("/sse")
public class SseController {
  
  // 該集合用來管理所有客戶端的連接
  private final Map<String, SseEmitter> sse = new ConcurrentHashMap<>() ;


  // 創建連接接口,同時指定了消息類型為text/event-stream
  @GetMapping(path="/events/{id}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  public SseEmitter createConnect(@PathVariable("id") String id) throws IOException {
    SseEmitter emitter = new SseEmitter(0L);
    // 每一個客戶端保存到Map中
    sse.put(id, emitter) ;
    // 當發生錯誤的回調
    emitter.onError(ex -> {
      System.err.printf("userId: %s, error: %s%n", id, ex.getMessage()) ;
      sse.remove(id) ;
    }) ;
   // 異步請求完成后的回調
    emitter.onCompletion(() -> {
      sse.remove(id) ;
      System.out.printf("%s, 請求完成...") ;
    }) ;
    // 異步請求超時回調
    emitter.onTimeout(() -> {
      System.err.println("超時...") ;
    }) ;
    return emitter;
  }
  
  // 該接口用來進行消息的發送
  // 由客戶端發起請求,然后根據id獲取相應的SseEmitter進行消息的發送
  @GetMapping("/sender/{id}")
  public String sender(@PathVariable("id") String id) throws Exception {
    SseEmitter emitter = this.sse.get(id) ;
    if (emitter != null) {
      try {
        emitter.send( "隨機消息 - " + new Random().nextInt(10000000)) ;
      } catch (Exception e) {
        System.err.println("%s%n", e.getMessage()) ;
      }
    }
    return "success" ;
  }
}

前端開發

前端比較簡單就是一個index.html頁面

<html>
  <head>
  <title>SSE</title>
</head>
<body>
  <button type="button" onclick="closeSse()">Close</button>
  <hr style="margin: 2px; padding: 0px 0px;"/>
  <ul id="list"></ul>
</body>
<script>
  const evtSource = new EventSource(`/sse/events/${Date.now()}`) ;
  evtSource.onmessage = (event) => {
    const newElement = document.createElement("li") ;
    const eventList = document.getElementById("list") ;
    newElement.innerHTML = "接收到消息: " + event.data ;
    eventList.appendChild(newElement) ;
  };
  evtSource.onopen = (event) => {
    console.log('建立連接...')
  };
  evtSource.onerror = (event) => {
    console.error("發生錯誤:", event) ;
  };
  function closeSse() {
    evtSource.close() ;
  }
</script>
</html>

以上就是前后端的開發,代碼非常的簡單;也就簡單的實現了由服務端實時數據推送。

EventSource對象的readyState有3個狀態值:

0 — connecting

1 — open

2 — closed

測試

圖片圖片

調用消息發送接口

圖片圖片


圖片圖片

自定義事件類型

修改消息發送接口

@GetMapping("/sender/{id}")
  public String sender(@PathVariable("id") String id) throws Exception {
    SseEmitter emitter = this.sse.get(id) ;
    if (emitter != null) {
      SseEventBuilder builder = SseEmitter.event() ;
      // 指定事件類型
      builder.name("chat") ;
      String msg = "隨機消息 - " + new Random().nextInt(10000000);
      builder.data(msg) ;
      try {
        emitter.send(builder) ;
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return "success" ;
  }

前端監聽具體事件類型消息

// 監聽指定事件類型消息
evtSource.addEventListener("chat", (event) => {
  const newElement = document.createElement("li");
  const eventList = document.getElementById("list");


  newElement.innerHTML = "chat message: " + event.data;
  eventList.appendChild(newElement);
});

注意:默認是“message”事件,因為它可以捕獲沒有 event 字段的事件, * 以及具有特定類型 `event:message` 的事件。* 它不會觸發任何其他類型的事件。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2024-04-01 08:38:57

Spring@AspectAOP

2023-11-28 09:44:10

2024-09-02 09:31:19

2019-08-20 14:13:12

工業物聯網IIOT藍牙

2020-11-12 18:48:54

安全電商數據中臺

2016-07-29 00:43:22

數據驅動

2021-09-10 09:09:58

ARTIF威脅智能框架安全工具

2016-12-23 14:58:58

容器WebSocketDocker Remo

2014-02-25 10:11:00

2025-09-08 03:15:00

JavaScript數據流接口

2020-12-09 10:15:34

Pythonweb代碼

2020-04-28 11:04:51

數據架構互聯網Flink

2020-05-29 17:10:15

數據架構數據一切數據體系

2022-06-06 15:44:24

大數據數據分析思維模式

2021-07-22 18:29:58

AI

2022-06-22 09:44:41

Python文件代碼

2020-12-23 10:10:23

Pythonweb代碼

2022-07-07 10:33:27

Python姿勢代碼

2021-07-30 16:09:18

加密貨幣比特幣貨幣

2025-01-15 12:00:00

Java線程編程
點贊
收藏

51CTO技術棧公眾號

欧美极品另类| 国产一区二区三区精品视频| av视屏在线播放| 日韩欧美一二三区| 91精品一区二区三区综合| 中文字幕一区二区三区四区在线视频| 欧美一区二区三区四区在线观看| 国产精品99视频| 97涩在线观看视频| 美女视频久久黄| 国产精品99久久久久久有的能看| 亚洲成色最大综合在线| 欧美探花视频资源| 午夜精品毛片| 成年网站免费| 国产成人精品在线观看| 国产精品久久久久桃色tv| 96sao在线精品免费视频| 777精品久无码人妻蜜桃| 久久久91精品| 99精品欧美一区二区三区小说| 久久uomeier| 黄色网页免费在线观看| 色吧影院999| 国产亚洲一区二区三区在线观看| 亚洲国产伊人| 我要看一级黄色大片| 7777精品视频| 欧美日韩精品免费观看视频| 久热精品在线| 日韩精品免费观看视频| 黑人粗进入欧美aaaaa| 伊人久久婷婷色综合98网| 日韩av一区二区三区在线| 亚洲摸下面视频| 国产福利一区二区三区| 女囚岛在线观看| 日日橹狠狠爱欧美超碰| 91精品美女在线| 69堂国产成人免费视频| 日韩免费观看高清完整版| 91小视频在线免费看| 久久亚洲国产| 欧美先锋资源| 偷偷www综合久久久久久久| 欧美日韩电影免费看| 成人日韩欧美| 91在线精品播放| 99免费精品视频| 欧美亚洲在线日韩| 99久久伊人| 一区二区三区视频网站| 男人午夜天堂| 日本美女高潮视频| 久久国产精品久久| 国产成人久久久精品一区| 精品国内自产拍在线观看| 欧美精品国产精品| 色综合网色综合| 亚洲一区视频在线| 国产日产精品一区| 免费观看一级特黄欧美大片| 91精品在线观看国产| 欧美一站二站| 波多野结衣在线观看一区二区| 国产精品亚洲欧美一级在线| 午夜影院一区| av影视在线| 成人bbav| 91精品国产黑色瑜伽裤| 午夜小视频在线观看| 成人高清网站| 麻豆传媒视频在线| 久久日韩视频| 青草在线视频在线观看| 色婷婷视频在线观看| 精品国产99久久久久久| 日本福利片在线| 亚洲黄色av网址| 中文字幕无码精品亚洲35| 爱爱爱视频网站| 国产精品视频免费观看| 91免费观看| 国产国语videosex另类| 国内偷自视频区视频综合| 色哟哟网站入口亚洲精品| 亚洲美女精品久久| 亚洲黄色av女优在线观看| 亚洲丝袜精品丝袜在线| 九九国产精品视频| 国产一区999| 国产精品嫩草99av在线| 精品电影一区| 亚洲天堂激情| 美女黄网久久| 成人高清电影网站| 欧美午夜电影在线观看 | 国产一区二区三区毛片| 精品国产免费人成电影在线观看四季| 91麻豆精品国产91久久久资源速度 | 精品国产在天天线2019| 欧美性猛xxx| 欧美在线你懂的| 欧美精品一区二区三区视频| 亚洲图片在线综合| 九九精品视频在线观看| 国产精品小说在线| 国精产品一区二区| 成人www视频在线观看| 久久综合一区| 国产 福利 在线| 国产无遮挡又黄又爽免费软件 | 成人在线免费观看91| 欧美aaaa视频| 麻豆成人91精品二区三区| 26uuu亚洲| 欧美日韩国产中文精品字幕自在自线| 欧美国产精品v| 久久免费看少妇高潮| 精品国产精品自拍| 精品91自产拍在线观看一区| 久久久久久国产精品三级玉女聊斋| 国产精品网红直播| 超碰10000| 欧美人体大胆444www| 综合在线影院| 在线看片成人| 麻豆国产91在线播放| 成人激情校园春色| 欧美三级乱人伦电影| 亚洲国产成人精品女人久久久| 亚洲第一区第二区| 亚洲精品欧美日韩| 国产v亚洲v天堂无码久久久| 国产黄a三级三级三级av在线看| jazzjazz国产精品麻豆| 精品一区二区三区视频| 午夜激情久久久| 色伦专区97中文字幕| 久久精品ww人人做人人爽| 亚洲天堂av影院| av在线一区二区| 欧美老少做受xxxx高潮| 日韩国产美国| 亚洲日本高清| 红桃视频在线观看一区二区| 久久国内精品自在自线400部| 日韩三级.com| 黄色大片在线免费看| 狠狠久久综合| 日韩视频一区| 亚洲美女视频在线| 久久精品视频在线观看| 91.com在线| 成人看片在线观看| 欧美日韩国产成人精品| 日韩成人伦理电影在线观看| 国产精品久久久久aaaa| 日韩精品一区二区三区四区视频| 国产h色视频在线观看| 三级欧美在线一区| 欧美精品一区二区免费| 久久久亚洲国产精品| 久久国产乱子精品免费女| 91情侣偷在线精品国产| 日韩午夜电影免费看| 日韩一区在线看| 538国产精品视频一区二区| 日韩加勒比系列| 亚洲成av人电影| 亚洲精品久久久一区二区三区 | 九九热这里只有精品6| 黄页网站在线| www.日韩在线| 欧美精品久久久久| 国产精品免费播放| 久久精品国产成人一区二区三区| 亚洲成色777777在线观看影院 | 欧美成人tv| 午夜精品久久久久久久99水蜜桃 | 最新真实国产在线视频| 国内精品久久久久国产盗摄免费观看完整版 | 国产免费亚洲高清| 久久黄色免费看| 欧美黑粗硬大| 亚洲图片自拍偷拍| 日韩免费电影一区二区三区| 欧美少妇精品| 亚洲欧美一区二区在线观看| 国产精品高精视频免费| а天堂中文在线官网| 国产a久久麻豆| 另类美女黄大片| 国产美女情趣调教h一区二区| 91国在线观看| 免费涩涩18网站入口| 国产精品乡下勾搭老头1| 奇米影视首页 狠狠色丁香婷婷久久综合| 欧美福利一区| 精品国产中文字幕|