SSE(Server-send Events) 服务器实时推送

Server-send Events(SSE):是一种基于Http协议轻量级服务器主动向客户端单向推送实时数据的技术,而WebSocket是基于WebSocket协议双向通信技术,工作原理是客户端通过发送一个特殊的 HTTP GET 请求到服务器,请求中包含 Accept: text/event-stream 头,表明客户端期望接收 SSE 数据流。

SSE响应流字段介绍:

event: <event_name>:可选字段,用于指定事件的名称,message是默认的事件名称。

data:必须字段,包含事件的数据内容,可以有多行,每行都以data:开头。

id:可选字段,提供一个唯一的标识符给事件,可用于断线重连和消息追踪。

retry:可选字段,指定客户端在连接断开后重连的间隔时间。

前端示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SSE Client</title>
</head>
 
<body>
    <ul id="messages"></ul>
    <script>
        const eventSource = new EventSource('http://localhost:80/rhxy/sse');
 
        eventSource.onmessage = function (event) {
            const messagesList = document.getElementById('messages');
            const newMessage = document.createElement('li');
            newMessage.textContent = `Received message: ${event.data}`;
            messagesList.appendChild(newMessage);
        };
 
        eventSource.onerror = function (error) {
            console.error('EventSource failed:', error);
        };
    </script>
</body>
 
</html>

后端示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@CrossOrigin
    @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    private void sendEvents(HttpServletResponse response) {
        response.setContentType("text/event-stream");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Connection", "keep-alive");
        response.setHeader("Cache-Control", "no-cache");
 
        for(int i = 0; i < 20; i++) {
            try {
                response.getWriter().write("id: " + i + "\n");
                response.getWriter().write("event: message\n");
                response.getWriter().write("retry: 10\n");
                response.getWriter().write("data: 我是第" + i + "个\n\n");
                response.getWriter().flush();
                Thread.sleep(1000);
 
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

  效果图:

 

posted @   如幻行云  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-02-13 Elasticsearch 聚合Aggregations API
点击右上角即可分享
微信分享提示