本文参考自:

  • Web消息推送之SSE_魅Lemon的博客-CSDN博客_sse推送

  • 【IT老齐237】超好用Web服务端主动推送技术SSE_哔哩哔哩_bilibili

1、Web消息推送简介

  • 短轮询

  • 长轮询

  • iframe流

  • SSE

  • MQTT

  • websocket

2、SSE原理介绍

2.1、概念

SSE(Server Sent Event),直译为服务器发送事件,顾名思义,也就是客户端可以获取到服务器发送的事件。我们常见的 http 交互方式是客户端发起请求,服务端响应,然后一次请求完毕;但是在 sse 的场景下,客户端发起请求,连接一直保持,服务端有数据就可以返回数据给客户端,这个返回可以是多次间隔的方式

2.2、SSE特点

  • 长连接

  • 服务端可以向客户端推送信息

从 sse 的特点出发,我们可以大致的判断出它的应用场景,需要轮询获取服务端最新数据的 case 下,多半是可以用它的。比如显示当前网站在线的实时人数,法币汇率显示当前实时汇率,电商大促的实时成交额等等

3、SpringBoot下实现SSE

3.1、环境搭建

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.7</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.tuwer</groupId><artifactId>server-sent-events</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>
  • 启动类
package com.tuwer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author 土味儿* Date 2023/1/28* @version 1.0*/
@SpringBootApplication
public class SseApp {public static void main(String[] args) {SpringApplication.run(SseApp.class, args);}
}

3.2、页面端html

resources资源路径下新建static目录,再创建index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>SSE Demo</title>
</head>
<body>
<div id="sse"></div>
<script>//var sse = new EventSource("http://localhost:8080/sse");//var sse = new EventSource("http://localhost:8080/sse-retry");var sse = new EventSource("http://localhost:8080/sse-retry-new");sse.onmessage = function (evt){var el = document.getElementById("sse");//el.innerHTML = evt.data;el.innerText = evt.data;};</script>
</body>
</html>

3.3、服务端Controller

package com.tuwer.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalTime;
import java.util.concurrent.TimeUnit;/*** @author 土味儿* Date 2023/1/28* @version 1.0*/
@RestController
public class SseController {/*** 服务端循环发送* @param httpServletResponse* @return*/@GetMapping("/sse")public String getStreamData(HttpServletResponse httpServletResponse) {httpServletResponse.setContentType("text/event-stream");httpServletResponse.setCharacterEncoding("utf-8");String s = "";while (true) {s = "data: " + LocalTime.now() + "\n\n";try {PrintWriter pw = httpServletResponse.getWriter();TimeUnit.SECONDS.sleep(1);pw.write(s);pw.flush();} catch (IOException | InterruptedException e) {e.printStackTrace();}}}/*** 客户端固定时间重试* @param httpServletResponse*/@GetMapping("/sse-retry")public void getDataRetry(HttpServletResponse httpServletResponse){httpServletResponse.setContentType("text/event-stream");httpServletResponse.setCharacterEncoding("utf-8");String s = "retry: 2000\n";s += "data: "+LocalTime.now() +"\n\n";PrintWriter pw = null;try {pw = httpServletResponse.getWriter();} catch (IOException e) {e.printStackTrace();}pw.write(s);pw.flush();}/*** 客户端固定时间重试(简洁版)* @return*/@GetMapping("/sse-retry-new")public String getDataRetry(){/** 数据格式:* --------------------------* retry: 重试时间(毫秒值)* 单换行\n* data: 具体数据* 双换行\n\n* --------------------------* retry和data后面是【半角冒号 + 空格】* --------------------------*/String result = new StringBuilder()// retry: 重试毫秒值 单换行.append("retry: 2000\n")// data: 具体数据.append("data: 当前时间:").append(LocalTime.now())// 双换行.append("\n\n").toString();return result;}
}


3.4、演示

客户端固定时间重试(简洁版)

SSE(Server-sent Events)实现Web消息推送(SpringBoot)相关推荐

  1. php实现Web消息推送框架

    文章来源:http://www.workerman.net/web-sender web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接 ...

  2. WEB消息推送—GoEasy

    web实时推送的技术在大多数项目里面都会用到,尤其是一些实时性要求高的项目,关于这方面的实现技术有许多,类似于webscoket.dwr.comet4j和netpush等等,其中在以往的篇幅里我也介绍 ...

  3. php socket laravel,Laravel整合PHPSocket.Io实现web消息推送

    PHPSocket.IO ,PHP跨平台实时通讯框架 PHPSocket.IO是 PHP 版本的Socket.IO服务端实现,基于workerman开发,用于替换node.js版本Socket.IO服 ...

  4. Web消息推送之SSE

    文章目录 一.消息推送简介 1.消息推送介绍 2.几种方式介绍 二.SSE原理介绍 1.SSE基础概念 2.SSE特点 3.SSE与WebSocket异同 三.SSE推送实现 1.概述 1.1 使用S ...

  5. SSM项目使用GoEasy 实现web消息推送服务

      一.背景 之前项目需要做一个推送功能,最开始我用websocket实现我的功能.使用websocket的好处是免费自主开发,但是有几个问题:1)浏览器的兼容问题,尤其是低版本的ie:2)因为是推送 ...

  6. 弃用server酱 自建个人消息推送

    之前一直用的server酱,但是后来server酱开始收费,于是就自己搞了一个接口,支持钉钉.微信.个人微信推送.目前暂时只支持文字,不支持卡片推送. 小飞博客-消息推送

  7. 基于workerman实现的web消息推送站内信功能

    流程说明 使用 web-msg-sender 作为 服务器监听程序. 客户端(浏览器)通过websocket连接 服务器监听程序. 服务器应用程序(后端) 通过curl访问 服务器监听程序,将需要推送 ...

  8. WEB消息推送-comet4j

    一.comet简介: comet :基于 HTTP长连接的"服务器推"技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据, ...

  9. 关于 Web消息推送系统 web-msg-sender 配置https 协议

    前几天做了一个语音播报功能,本地测试ok,但是上线要求https协议费了点时间 1.启动失败情况出现如下错误 Waring stream_socket_server has been disabled ...

最新文章

  1. Ubuntu环境下docker的安装
  2. wordpress 重新生成附件文件名
  3. 喵哈哈村的魔法考试 Round #5 (Div.2) C
  4. mysql explain 解释
  5. java中的後綴表達式_求Java堆栈,将中缀算术表达式转换成后缀表达式。
  6. 利用python进行数据分析第一版和第二版区别_《利用Python进行数据分析·第2版》第1章 准备工作...
  7. linux搭建SonarQube代码质量平台_Oracle 最新详细版本
  8. 第十四节(接口(行为))
  9. 王爽《汇编语言》第2版-----2、寄存器
  10. SDL附着window窗口的方法
  11. 【BZOJ4378】[POI2015]Logistyka 树状数组
  12. MacBook Pro M1外接显示器模糊解决之分辨率调节
  13. 在电路中,耦合是什么?有哪些方式?
  14. Python实现excel表格合并
  15. 关于鼠标右键无法正常加载一直转圈
  16. spring中自带的缓存springcache
  17. poj 1129 四色原理DFS
  18. 计算机二级考试中Excel函数如何应用,计算机二级考试excle常用函数【计算机二级ms office中excel中必考函数有哪些?】...
  19. RGB888 和 RGB565
  20. FSL 功能磁共振影像分析: single-session

热门文章

  1. 深入理解wifi direct
  2. win7计算机服务项,新萝卜家园win7旗舰版服务项的详解
  3. ip camera如何将流媒体信息传送到流媒体服务器,IP Camera远程监控系统的设计与实现...
  4. 车道线检测CondLaneNet论文和源码解读
  5. html flag属性,html5 的flag是什么意思?
  6. 2020年的数据工程
  7. pytdx 安装 初步使用
  8. sort按vector元素排序
  9. 如何利用家里的闲置电脑搭建自己的博客
  10. JSTL 标签库c:if :forEach :forTokens