当前位置:首页 > 科技  > 软件

实时数据推送并非只有WebSocket一种选择

来源: 责编: 时间:2023-09-28 10:08:12 441观看
导读环境:SpringBoot2.7.16概述在Web应用中,有几种实时数据推送的选择方案,包括SSE(Server-Sent Events)、WebSocket、长轮询等。SSE是一种基于HTTP协议的服务器向客户端推送数据的技术。它的优点是实现简单、轻量级,对现有服务

环境:SpringBoot2.7.16hSj28资讯网——每日最新资讯28at.com

概述

在Web应用中,有几种实时数据推送的选择方案,包括SSE(Server-Sent Events)、WebSocket、长轮询等。hSj28资讯网——每日最新资讯28at.com

SSE是一种基于HTTP协议的服务器向客户端推送数据的技术。它的优点是实现简单、轻量级,对现有服务器软件兼容性好。但是,由于SSE是单向通信模型,只能由服务器向客户端推送数据,对于需要客户端向服务器发送数据的场景,SSE就无法满足需求。hSj28资讯网——每日最新资讯28at.com

WebSocket是一种双向通信模型,允许客户端和服务器之间互相发送消息。它的优点是实时性强、延迟低,但是需要服务器端支持对应的协议栈,实现起来相对复杂一些。hSj28资讯网——每日最新资讯28at.com

长轮询是对短轮询的一种改进版本,通过在尽可能减少对服务器资源浪费的同时,保证消息的相对实时性。长轮询在客户端发起请求时,服务器会保持连接打开,等待一定时间后再返回响应。这样可以减少客户端频繁的请求,节省带宽和服务器资源。但是,如果服务器没有新的消息产生,客户端会一直等待响应,实时性就会受到一定影响。hSj28资讯网——每日最新资讯28at.com

根据实际应用场景和需求,可以选择适合的实时数据推送方案。如果只需要服务器向客户端推送数据,且对实时性要求不是特别高,可以选择SSE。如果需要客户端向服务器发送数据,或者对实时性要求较高,可以选择WebSocket或长轮询。当然,也可以根据实际情况将这几种方案结合起来使用,以满足不同的需求。hSj28资讯网——每日最新资讯28at.com

SSE与WebSocket对比

SSE(Server-Sent Events)和WebSocket都是用于实现实时通信的技术,存在关键差异。hSj28资讯网——每日最新资讯28at.com

通信模型:SSE是单向通信模型,只能由服务器向客户端推送数据。而WebSocket是双向通信模型,客户端和服务器可以互相发送消息。hSj28资讯网——每日最新资讯28at.com

连接性:SSE使用长轮询或HTTP流技术,需要频繁地发起HTTP请求来获取数据。而 WebSocket只需在握手阶段建立一次连接,然后保持连接打开,减少了频繁建立连接的开销。hSj28资讯网——每日最新资讯28at.com

实时性:WebSocket提供了更低的延迟和更高的实时性,因为它支持双向通信,可以立即将数据推送给客户端。SSE虽然也可以实现实时性,但由于其单向通信模型,需要服务器定期发送数据。hSj28资讯网——每日最新资讯28at.com

协议特性:SSE是部署在HTTP协议之上的,现有的服务器软件都支持。而WebSocket是一个新的协议,需要服务器端支持对应的协议栈。hSj28资讯网——每日最新资讯28at.com

复杂性:SSE相对WebSocket来说更轻量级,实现更简单。WebSocket协议较复杂,实现相对困难一些。hSj28资讯网——每日最新资讯28at.com

总体来说,SSE和WebSocket都有各自的优点和适用场景。SSE轻量级且对现有服务器软件兼容性好,而WebSocket则提供了更强的双向通信能力和更高的实时性。hSj28资讯网——每日最新资讯28at.com

SSE简介

SSE(Server-Sent Events)是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比,SSE提供了更高效和实时的数据推送机制。hSj28资讯网——每日最新资讯28at.com

SSE基于HTTP协议,允许服务器将数据以事件流(Event Stream)的形式发送给客户端。客户端通过建立持久的HTTP连接,并监听事件流,可以实时接收服务器推送的数据。hSj28资讯网——每日最新资讯28at.com

SSE的主要特点包括:hSj28资讯网——每日最新资讯28at.com

简单易用:SSE使用基于文本的数据格式,如纯文本、JSON等,使得数据的发送和解析都相对简单。hSj28资讯网——每日最新资讯28at.com

单向通信:SSE支持服务器向客户端的单向通信,服务器可以主动推送数据给客户端。hSj28资讯网——每日最新资讯28at.com

实时性:SSE建立长时间的连接,使得服务器可以实时地将数据推送给客户端,而无需客户端频繁地发起请求。hSj28资讯网——每日最新资讯28at.com

服务端开发

依赖管理hSj28资讯网——每日最新资讯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>

配置文件hSj28资讯网——每日最新资讯28at.com

spring:  mvc:    static-path-pattern: /**  web:    resources:      #静态文件目录index.html      static-locations: classpath:/templates/

接口开发hSj28资讯网——每日最新资讯28at.com

@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页面hSj28资讯网——每日最新资讯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("发生错误:", event) ;  };  function closeSse() {    evtSource.close() ;  }</script></html>

以上就是前后端的开发,代码非常的简单;也就简单的实现了由服务端实时数据推送。hSj28资讯网——每日最新资讯28at.com

EventSource对象的readyState有3个状态值:hSj28资讯网——每日最新资讯28at.com

0 — connectinghSj28资讯网——每日最新资讯28at.com

1 — openhSj28资讯网——每日最新资讯28at.com

2 — closedhSj28资讯网——每日最新资讯28at.com

测试

图片图片hSj28资讯网——每日最新资讯28at.com

调用消息发送接口hSj28资讯网——每日最新资讯28at.com

图片图片hSj28资讯网——每日最新资讯28at.com


hSj28资讯网——每日最新资讯28at.com

图片图片hSj28资讯网——每日最新资讯28at.com

自定义事件类型

修改消息发送接口hSj28资讯网——每日最新资讯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" ;  }

前端监听具体事件类型消息hSj28资讯网——每日最新资讯28at.com

// 监听指定事件类型消息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` 的事件。* 它不会触发任何其他类型的事件。hSj28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-11854-0.html实时数据推送并非只有WebSocket一种选择

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 五分钟k8s入门到实战-应用配置

下一篇: 学会Sequelize,让你操作数据更丝滑!

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top