使用SSE(服务器发送事件)流式输出

在现代Web开发中,实时数据流的需求日益增多。SSE(Server-Sent Events,服务器发送事件)是一种轻量级的协议,允许服务器主动向浏览器推送更新的数据。与WebSocket不同,SSE是单向的,只允许服务器向客户端发送数据,客户端无法向服务器发送信息。本文将介绍如何在Java Web中使用SSE实现流式输出。

一、搭建基本的Java Web环境

首先,你需要配置Java Web环境,可以使用Spring Boot或Servlet来创建一个简单的Web应用。这里我们以Spring Boot为例:

<!-- pom.xml -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、创建SSE控制器

下面我们将创建一个控制器,来发送SSE数据。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.time.LocalTime;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@RestController
public class SseController {

    private final ExecutorService executorService = Executors.newSingleThreadExecutor();

    @GetMapping("/sse")
    public SseEmitter streamSseMvc() {
        SseEmitter emitter = new SseEmitter();

        executorService.submit(() -> {
            try {
                // 定时发送数据
                while (true) {
                    String message = "当前时间: " + LocalTime.now();
                    emitter.send(message);
                    Thread.sleep(1000); // 每秒发送一次
                }
            } catch (IOException | InterruptedException e) {
                emitter.completeWithError(e);
            }
        });

        // 监听连接关闭
        emitter.onCompletion(() -> System.out.println("SSE连接已关闭"));
        emitter.onTimeout(() -> {
            System.out.println("SSE连接超时");
            emitter.complete();
        });

        return emitter;
    }
}

上面的代码中,我们创建了一个SSE控制器。当访问 /sse 路径时,浏览器将建立一个与服务器的连接,服务器每秒向客户端推送当前时间。

三、前端实现

接下来,我们需要在前端使用JavaScript来接收这些SSE消息。你可以在HTML页面中添加如下代码:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SSE 示例</title>
</head>
<body>
    <h1>SSE实时更新</h1>
    <div id="messages"></div>

    <script>
        const eventSource = new EventSource('/sse');
        const messagesDiv = document.getElementById('messages');

        eventSource.onmessage = function(event) {
            const newMessage = document.createElement('div');
            newMessage.textContent = event.data;
            messagesDiv.appendChild(newMessage);
        };

        eventSource.onerror = function(event) {
            console.error("SSE连接出错", event);
        };
    </script>
</body>
</html>

在这个HTML文档中,我们创建了一个<div>来显示服务器发送的消息。通过EventSource对象建立与 /sse 路径的连接,当有新消息到达时,自动调用onmessage事件处理器。

四、总结

使用SSE进行流式输出在实时更新应用中非常有用,无论是股票价格、聊天消息,还是实时监测数据,均可以轻松实现。通过上述代码示例,我们创建了一个简单的Java Web应用,使用SSE实现了服务器向客户端的实时数据推送。

通过合理利用SSE,可以使你的Web应用更加生动与互动,同时也减少了客户端向服务器的轮询请求,提高了性能和响应效率。当然,SSE也有其局限性,例如只支持UTF-8编码的文本数据,适合于低频率的场景,因此在选择技术时需要根据具体需求进行考量。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部