服务端常用推送技术有:
1、客户端轮询:ajax定时拉取
2、服务端主动推送:WebSocket。全双工的,本质上是一个额外的tcp连接,建立和关闭时握手使用http协议,其他数据传输不使用http协议,更加复杂一些,适用于需要进行复杂双向数据通讯的场景。
3、服务端主动推送:SSE (Server Send Event)。html5新标准,用来从服务端实时推送数据到浏览器端,
直接建立在当前http连接上,本质上是保持一个http长连接,轻量协议简单的服务器数据推送的场景,使用服务器推送事件, SSE技术是基于单工通信模式,只是单纯的客户端向服务端发送请求,服务端不会主动发送给客户端。服务端采取的策略是抓住这个请求不放,等数据更新的时候才返回给客户端,当客户端接收到消息后,再向服务端发送请求,周而复始。

这篇文章介绍Springboot中使用SseEmitter实现消息推送。

1、服务端:

package com.iscas.biz.test.sse;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
 *  测试SSE推送消息
 * @author zhuquanwen
 * @vesion 1.0
 * @date 2021/9/11 21:01
 * @since jdk1.8
@RestController
@RequestMapping(path = "sse/test")
public class SseControllerTest {
    private static Map<String, SseEmitter> sseCache = new ConcurrentHashMap<>();
    @GetMapping(path = "subscribe", produces = {MediaType.TEXT_EVENT_STREAM_VALUE})
    public SseEmitter push(String id) throws IOException {
        // 超时时间设置为3s,用于演示客户端自动重连
        SseEmitter sseEmitter = new SseEmitter(30000L);
        // 设置前端的重试时间为1s
        sseEmitter.send(SseEmitter.event().reconnectTime(1000).data("连接成功"));
        sseCache.put(id, sseEmitter);
        System.out.println("add " + id);
        sseEmitter.onTimeout(() -> {
            System.out.println(id + "超时");
            sseCache.remove(id);
        });
        sseEmitter.onCompletion(() -> System.out.println("完成!!!"));
        return sseEmitter;
    @GetMapping(path = "push")
    public String push(String id, String content) throws IOException {
        SseEmitter sseEmitter = sseCache.get(id);
        if (sseEmitter != null) {
            sseEmitter.send(SseEmitter.event().name("msg").data("后端发送消息:" + content));
        return "over";
    @GetMapping(path = "over")
    public String over(String id) {
        SseEmitter sseEmitter = sseCache.get(id);
        if (sseEmitter != null) {
            sseEmitter.complete();
            sseCache.remove(id);
        return "over";

其中subscribe是开启并订阅消息,push是模拟触发后端推送,over是模拟断开sse连接。

2、客户端:

<!doctype html>
<html lang="en">
    <title>Sse测试</title>
    <meta charset="utf-8"/>
</head>
<div>sse测试</div>
<div id="result"></div>
</body>
</html>
<script>
    var source = new EventSource('http://localhost:7901/demo/sse/test/subscribe?id=qwe');
    //source.onmessage = function (event) {
     //   text = document.getElementById('result').innerText;
      //  text += '\n' + event.data;
       // document.getElementById('result').innerText = text;
    source.addEventListener("msg", function(e) {
        text = document.getElementById('result').innerText;
        text += '\n' + e.data;
        console.log(e);
        document.getElementById('result').innerText = text;
        //source.close();
    source.onerror = function(e) {
        if (e.readyState == EventSource.CLOSE) {
            text = document.getElementById('result').innerText;
            text += '\n' + "连接关闭";
    <!-- 添加一个开启回调 -->
    source.onopen = function (event) {
        text = document.getElementById('result').innerText;
        text += '\n 开启: ';
        console.log(event);
        document.getElementById('result').innerText = text;
</script>
                    服务端常用推送技术有:1、客户端轮询:ajax定时拉取2、服务端主动推送:WebSocket。全双工的,本质上是一个额外的tcp连接,建立和关闭时握手使用http协议,其他数据传输不使用http协议,更加复杂一些,适用于需要进行复杂双向数据通讯的场景。3、服务端主动推送:SSE (Server Send Event)。html5新标准,用来从服务端实时推送数据到浏览器端,直接建立在当前http连接上,本质上是保持一个http长连接,轻量协议简单的服务器数据推送的场景,使用服务器推送事件, SSE技.
				
rabbitmq+websocket(SpringBoot版)实现分布式消息推送 本来想用websocket做一个消息推送 可是分布式环境下不支持session共享因为服务器不同 所以采用 rabbitMQ+webSocket实现分布式消息推送 生产者将消息 发送给 rabbitMQ 的 virtual-host:/(顶极路由) 再由它路由到交换机 最终由交换机通过路由键指定具体的管道 消费者监听指定的管道获取消息 最终将获取的消息 交给 webSocket 被@OnMessage注解标识的方法 每次消费一条消息交给 被@OnMessage注解标识的方法 返回给前台 实现分布式实时推送
private static final Map<Long, SseEmitter> SSE_EMITTER_MAP = new HashMap<>(16); @GetMapping("/{id}") public SseEmitter getSseEmitter(@PathVariable Long id) { //0L设置永不超时 SseEmitter sseEmitt
这是SpringMVC提供的一种技术,可以实现服务端向客户端实时推送数据.用法非常简单,只需要在Controller提供一个接口,创建并返回SseEmitter对象,发送数据可以在另一个接口调用其send方法发送数据. SpringBoot已经集成了这个 ,所以不用再引其他依赖 废话不多说 直接贴代码 package com.cuit.sseemitterdemo.sseemitterde...
2.利用长链接,后端向前端主动推送下单消息 果断选择第二种。从以往的经验,首先想到websocket,但是websocket属于双向通道,且服务端比较琐碎,就在网上找了下其他类似技术,看到了SseMmitter,查看了向网上相关文章,及用例。正好符合我们的需求,话不多说,上代码 一、新增see对象 public class SeeResult {
SpringBoot WEB系列】SSE 服务器发送事件详解 SSE 全称Server Sent Event,直译一下就是服务器发送事件,一般的项目开发,用到的机会不多,可能很多小伙伴不太清楚这个东西,到底是干啥的,有啥用 本文主要知识点如下: SSE 扫盲,应用场景分析 借助异步请求实现 sse 功能,加深概念理解 使用SseEmitter实现一个简单的推送示例 I. SSE 扫...
3. 编写推送消息的代码 在需要推送消息的地方,注入JPushClient对象,然后调用JPushClient的相关方法即可实现推送消息的功能。以下是一个简单的推送消息的示例: ```java @RestController public class PushController { @Autowired private JPushClient jPushClient; @PostMapping("/push") public String pushMessage(@RequestParam("message") String message) { PushPayload payload = PushPayload.newBuilder() .setPlatform(Platform.all()) .setAudience(Audience.all()) .setNotification(Notification.alert(message)) .build(); try { PushResult result = jPushClient.sendPush(payload); return result.toString(); } catch (APIConnectionException | APIRequestException e) { e.printStackTrace(); return e.getMessage(); 在上述代码,我们构建了一个PushPayload对象,设置了推送平台、推送对象和推送消息,然后调用JPushClient的sendPush方法发送推送消息。 以上就是SpringBoot集成极光推送进行推送消息的基本步骤和代码示例。希望能够对您有所帮助。 TGITCIC: 这种文章就是copy paste不动脑,我告诉你们吧(因为参与过GPT内核编码),在send结束后,来一条单独的send("END");,然后在vue端:if (event.data === 'END') { eventSource.close(); }else{ console.log(">>>>>>onmessage->"+event.data) that.printGPTContents(event.data); java实现web ssh客户端 费列罗灬: 可以上传文件么