日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-09-28 10:08:12 280觀看
導讀環(huán)境:SpringBoot2.7.16概述在Web應用中,有幾種實時數據推送的選擇方案,包括SSE(Server-Sent Events)、WebSocket、長輪詢等。SSE是一種基于HTTP協(xié)議的服務器向客戶端推送數據的技術。它的優(yōu)點是實現簡單、輕量級,對現有服務

環(huán)境:SpringBoot2.7.16mb528資訊網——每日最新資訊28at.com

概述

在Web應用中,有幾種實時數據推送的選擇方案,包括SSE(Server-Sent Events)、WebSocket、長輪詢等。mb528資訊網——每日最新資訊28at.com

SSE是一種基于HTTP協(xié)議的服務器向客戶端推送數據的技術。它的優(yōu)點是實現簡單、輕量級,對現有服務器軟件兼容性好。但是,由于SSE是單向通信模型,只能由服務器向客戶端推送數據,對于需要客戶端向服務器發(fā)送數據的場景,SSE就無法滿足需求。mb528資訊網——每日最新資訊28at.com

WebSocket是一種雙向通信模型,允許客戶端和服務器之間互相發(fā)送消息。它的優(yōu)點是實時性強、延遲低,但是需要服務器端支持對應的協(xié)議棧,實現起來相對復雜一些。mb528資訊網——每日最新資訊28at.com

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

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

SSE與WebSocket對比

SSE(Server-Sent Events)和WebSocket都是用于實現實時通信的技術,存在關鍵差異。mb528資訊網——每日最新資訊28at.com

通信模型:SSE是單向通信模型,只能由服務器向客戶端推送數據。而WebSocket是雙向通信模型,客戶端和服務器可以互相發(fā)送消息。mb528資訊網——每日最新資訊28at.com

連接性:SSE使用長輪詢或HTTP流技術,需要頻繁地發(fā)起HTTP請求來獲取數據。而 WebSocket只需在握手階段建立一次連接,然后保持連接打開,減少了頻繁建立連接的開銷。mb528資訊網——每日最新資訊28at.com

實時性:WebSocket提供了更低的延遲和更高的實時性,因為它支持雙向通信,可以立即將數據推送給客戶端。SSE雖然也可以實現實時性,但由于其單向通信模型,需要服務器定期發(fā)送數據。mb528資訊網——每日最新資訊28at.com

協(xié)議特性:SSE是部署在HTTP協(xié)議之上的,現有的服務器軟件都支持。而WebSocket是一個新的協(xié)議,需要服務器端支持對應的協(xié)議棧。mb528資訊網——每日最新資訊28at.com

復雜性:SSE相對WebSocket來說更輕量級,實現更簡單。WebSocket協(xié)議較復雜,實現相對困難一些。mb528資訊網——每日最新資訊28at.com

總體來說,SSE和WebSocket都有各自的優(yōu)點和適用場景。SSE輕量級且對現有服務器軟件兼容性好,而WebSocket則提供了更強的雙向通信能力和更高的實時性。mb528資訊網——每日最新資訊28at.com

SSE簡介

SSE(Server-Sent Events)是一種用于實現服務器向客戶端實時推送數據的Web技術。與傳統(tǒng)的輪詢和長輪詢相比,SSE提供了更高效和實時的數據推送機制。mb528資訊網——每日最新資訊28at.com

SSE基于HTTP協(xié)議,允許服務器將數據以事件流(Event Stream)的形式發(fā)送給客戶端。客戶端通過建立持久的HTTP連接,并監(jiān)聽事件流,可以實時接收服務器推送的數據。mb528資訊網——每日最新資訊28at.com

SSE的主要特點包括:mb528資訊網——每日最新資訊28at.com

簡單易用:SSE使用基于文本的數據格式,如純文本、JSON等,使得數據的發(fā)送和解析都相對簡單。mb528資訊網——每日最新資訊28at.com

單向通信:SSE支持服務器向客戶端的單向通信,服務器可以主動推送數據給客戶端。mb528資訊網——每日最新資訊28at.com

實時性:SSE建立長時間的連接,使得服務器可以實時地將數據推送給客戶端,而無需客戶端頻繁地發(fā)起請求。mb528資訊網——每日最新資訊28at.com

服務端開發(fā)

依賴管理mb528資訊網——每日最新資訊28at.com

<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>

配置文件mb528資訊網——每日最新資訊28at.com

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

接口開發(fā)mb528資訊網——每日最新資訊28at.com

@RestController@RequestMapping("/sse")public class SseController {    // 該集合用來管理所有客戶端的連接  private final Map<String, SseEmitter> sse = new ConcurrentHashMap<>() ;  // 創(chuàng)建連接接口,同時指定了消息類型為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) ;    // 當發(fā)生錯誤的回調    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;  }    // 該接口用來進行消息的發(fā)送  // 由客戶端發(fā)起請求,然后根據id獲取相應的SseEmitter進行消息的發(fā)送  @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" ;  }}

前端開發(fā)

前端比較簡單就是一個index.html頁面mb528資訊網——每日最新資訊28at.com

<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("發(fā)生錯誤:", event) ;  };  function closeSse() {    evtSource.close() ;  }</script></html>

以上就是前后端的開發(fā),代碼非常的簡單;也就簡單的實現了由服務端實時數據推送。mb528資訊網——每日最新資訊28at.com

EventSource對象的readyState有3個狀態(tài)值:mb528資訊網——每日最新資訊28at.com

0 — connectingmb528資訊網——每日最新資訊28at.com

1 — openmb528資訊網——每日最新資訊28at.com

2 — closedmb528資訊網——每日最新資訊28at.com

測試

圖片圖片mb528資訊網——每日最新資訊28at.com

調用消息發(fā)送接口mb528資訊網——每日最新資訊28at.com

圖片圖片mb528資訊網——每日最新資訊28at.com


mb528資訊網——每日最新資訊28at.com

圖片圖片mb528資訊網——每日最新資訊28at.com

自定義事件類型

修改消息發(fā)送接口mb528資訊網——每日最新資訊28at.com

@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" ;  }

前端監(jiān)聽具體事件類型消息mb528資訊網——每日最新資訊28at.com

// 監(jiān)聽指定事件類型消息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` 的事件。* 它不會觸發(fā)任何其他類型的事件。mb528資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-11854-0.html實時數據推送并非只有WebSocket一種選擇

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 五分鐘k8s入門到實戰(zhàn)-應用配置

下一篇: 學會Sequelize,讓你操作數據更絲滑!

標簽:
  • 熱門焦點
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業(yè)務中需要進行各種審批流程時,可能會面臨一系列技術和業(yè)務上的挑戰(zhàn)。手動處理這些審批流程可能會導致開發(fā)成本的增加以及業(yè)務復雜度的上升。在這
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業(yè)人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛。現在,我們就開始今
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優(yōu)酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應該選擇什么樣的著裝?&rdquo;近日,在網絡上,一個與著裝相關的帖子引發(fā)關注,在該帖子里,一位在高級寫字樓亞洲金
  • 網傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網友@長三角行健者爆料稱,據經銷商集團反饋,小米汽車目前已經開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • OPPO K11樣張首曝:千元機影像“卷”得真不錯!

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續(xù)還將開展常態(tài)化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 呈贡县| 连山| 德庆县| 开原市| 曲周县| 黔西| 广平县| 德钦县| 成武县| 扶余县| 岳普湖县| 赤城县| 邹城市| 游戏| 桃园县| 西安市| 苏尼特右旗| 鲜城| 蓝田县| 延寿县| 房山区| 盖州市| 衡山县| 繁峙县| 娄烦县| 天气| 山阴县| 方城县| 米林县| 大方县| 鹤山市| 威宁| 莱芜市| 无棣县| 扬中市| 达日县| 尼玛县| 建阳市| 石首市| 纳雍县| 壶关县|