java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java SpringBoot服务器发送事件

使用Java和SpringBoot实现服务器发送事件(Server-Sent Events)

作者:基督山伯爵_Neo

使用Java开发web应用,大多数时候我们提供的接口返回数据都是一次性完整返回,有些时候,我们也需要提供流式接口持续写出数据,以下提供一种简单的方式,本文给大家介绍了如何在Java web中实现服务器发送事件,需要的朋友可以参考下

引言

使用Java开发web应用,大多数时候我们提供的接口返回数据都是一次性完整返回。有些时候,我们也需要提供流式接口持续写出数据,以下提供一种简单的方式。

SSE(Server-Sent Events)

SSE 是一种允许服务器单向发送事件到客户端的技术,它基于HTTP协议,服务器可以推送消息到客户端,但客户端不能向服务器发送消息。

实现

直接上代码

@RestController
public class TestController {

    private static final Logger logger = LoggerFactory.getLogger(TestController.class);

    @GetMapping("/test")
    public void test(HttpServletResponse response) {
        response.setContentType("text/event-stream");
        response.setCharacterEncoding("utf-8");

        try (final PrintWriter writer = response.getWriter()) {
            // 要推送的内容
            final String content = "你好,我的朋友,快过年了,提前祝你新年快乐!";
            int len = content.length();
            int endIndex = 0;
            // 每隔2个字符推送一次,模拟打字机效果
            while (endIndex < len) {
                endIndex = Math.min(endIndex + 2, len);
                final String subContent = content.substring(0, endIndex);
                // 将要推送的内容封装成JSON格式,模拟实际开发中的数据格式,非必须
                final JSONObject json = new JSONObject();
                json.put("data", subContent);
                json.put("code", HttpStatus.OK.value());
                // 最后一次推送时,type为finish,表示推送结束,其它情况为add
                final String type = endIndex == len
                        ? "finish"
                        : "add";
                json.put("type", type);
                // 组装成SSE格式的数据,发送给前端,这个格式(data: content\n\n)是固定的,content是自定义的推送内容
                writer.write("data: " + json.toJSONString() + "\n\n");
                writer.flush();
                // 稍微给点停顿,防止数据发送太快,浏览器接收不过来
                TimeUnit.MILLISECONDS.sleep(100);
            }
        } catch (Exception e) {
            Thread.currentThread().interrupt();
            logger.error("流式推送数据异常", e);
        }
    }
}

组装数据,格式固定为"data: " + content + "\n\n",这里的数据格式是服务器发送事件(Server-Sent Events,SSE)的标准格式。

SSE 中,数据必须以 "data: " 开头,然后是要发送的数据,最后是两个换行符"\n\n"。这是SSE的规定格式,客户端会根据这种格式来解析服务器发送的事件。

接口调试

用接口调试工具(我用的是Apifox)调试接口如下:

接口符合SSE规范,所以可以被正常识别为事件流推送。

SSE与其他实时通信技术的比较

SSE与WebSocket的比较

SSE与长轮询的比较

注意事项

以上就是使用Java和SpringBoot实现服务器发送事件(Server-Sent Events)的详细内容,更多关于Java SpringBoot服务器发送事件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文