服务器端SEE推送

服务器端代码:

@RestController
@RequestMapping("see")
public class SSEController {

    /**\在Server-sent Events规范中,服务器的响应类型是 text/event-stream,而响应的内容可以看成一个事件流,由不同的事件组成,每个事件由类型和数据组成,同时每个事件可以有一个可选的标识符。不同的事件之间通过空行分隔。传输的字符串后面必须用空行分隔
     *
     * @return
     */
    @RequestMapping(value="/get_data",produces = "text/event-stream;charset=UTF-8")
    public String push(){
        try{
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "data:xdclass 行情"+ Math.random()+"\n\n";
    }
}

页面端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>服务端主动推送</title>
    <script type="text/javascript">
        var source = new EventSource('http://192.168.124.10:9005/see/get_data');
        source.onmessage = function (event) {
            document.getElementById('result').innerHTML = event.data;

        };
    </script>
</head>
<body>
<div>服务端主动推送
<div id="result">

</div>
</div>
</body>
</html>
### 单向推送(SSE)技术实现详解 SSE(Server-Sent Events)是一种基于 HTTP 协议的单向通信技术,允许服务器主动向客户端推送数据[^1]。SSE 通常用于需要服务器向客户端实时更新数据的场景,例如实时消息通知、股票价格更新、数据大屏展示等[^2]。 #### 协议基础 SSE 使用标准的 HTTP 协议进行通信,客户端通过 `EventSource` 接口建立连接,服务器端则通过响应头 `Content-Type: text/event-stream` 来标识这是一个事件流。该协议支持 UTF-8 编码,并且连接在默认情况下是持久化的,直到客户端主动关闭或服务器断开连接。 #### 客户端实现 在客户端,SSE 通过 `EventSource` 对象实现。以下是 Vue 项目中使用 SSE 的示例代码: ```javascript let _this = this; if (!!window.EventSource) { _this.Loading = true; const source = new EventSource("http://example.com/endpoint"); source.addEventListener("message", function(e) { let data = JSON.parse(e.data); _this.Loading = false; // 处理接收到的数据 }, false); source.addEventListener("open", function(e) { // 连接成功时的处理 }, false); source.addEventListener("error", function(e) { // 错误处理 source.close(); }); } else { console.log("当前浏览器不支持SSE"); } ``` 在 Vue 项目中,如果需要配置代理以解决跨域问题,可以在 `config/index.js` 中配置 `proxyTable`: ```javascript proxyTable: { '/xxx': { target: 'http://xxxxx:端口号/', changeOrigin: true, pathRewrite: { '^/xxx': '/xxx' } } } ``` #### 服务端实现 服务端实现 SSE 需要设置响应头为 `Content-Type: text/event-stream`,并保持连接打开以持续发送数据。以下是 Node.js 示例代码: ```javascript app.get('/sse', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 模拟数据推送 setInterval(() => { res.write(`data: ${JSON.stringify({ message: "Hello from server" })}\n\n`); }, 5000); }); ``` #### 优缺点分析 - **优点**: - 简单易用:SSE 基于 HTTP 协议,实现简单,易于调试。 - 自动重连:当连接断开时,`EventSource` 会自动尝试重新连接。 - 支持事件类型:可以定义不同的事件类型,客户端可以监听特定的事件。 - **缺点**: - 单向通信:SSE 仅支持服务器向客户端的数据推送,无法实现双向通信。 - 浏览器兼容性:虽然现代浏览器普遍支持 SSE,但部分旧浏览器可能不兼容。 #### 使用场景 SSE 适用于需要服务器向客户端推送实时数据的场景,例如: - 实时消息通知 - 数据大屏的动态更新 - 在线聊天应用(单向推送) #### 与 WebSocket 的对比 - **WebSocket**:全双工通信,适合需要双向实时交互的场景,例如在线游戏、视频会议等。 - **SSE**:单向通信,适合服务器向客户端推送数据的场景,实现更简单,且兼容性较好。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值