sse

web workers sse websocket

  • web workers
: 单独开一个线程,进行大量数据的处理



特点: 单向通道,建立连接后,只能服务器想客户端发送消息
如果客户端需要想服务器发送消息,需要新的http请求,这对比websocket开销更大

SSE本质是发送的不是一次性的数据包,而是一个数据流
因为ie上的XMLHttpRequest对象不支持获取部分的响应内容,只有在响应完成之后才能获取其内容。

sse最大优势:
sse可以利用原先的http协议
1 基与http协议,不需要服务器单独支持,存在基础设施优势

  • websocket
1、全双工通信的,可以很方便的实现两端的自由交流。
2、二进制协议,对于二进制数据传输更合适
3、 频率大于1次/秒,甚至更频繁,WebSocket更适合
 
缺点:
1 需要服务器支持


实现对比

分析短轮询长轮询web socketsse
通讯方式httphttp基于TCP长连接通讯http
触发方式轮询轮询事件事件
优点兼容好容错性强,实现简单http全双工通讯协议,性能开销小、安全性高,有一定可扩展性实现简便,开发成本低
缺点安全性差,占较多的内存资源与请求数安全性差,占较多的内存资源与请求数传输数据需要进行二次解析,增加开发成本及难度只适用高级浏览器
适用范围b/s服务b/s服务网络游戏、银行交互和支付服务端到客户端单向推送
分析轮询web socketsse
服务器部署noyesno
浏览器兼容性good许多现代浏览器支持高级浏览器,ie不支持
后端推送yesyesno
  • 如何选择
1 数据够频繁:数据推送,(例如几分钟一个这种,直接用数据拉取的方式更好,这样可以减少服务器资源占用)

2 数据频率:如果发送频率大于1次/秒,甚至更频繁,WebSocket更适合

3 是否需要二进制数据交流,如果有大量二进制数据需要传输,用WebSocket

4 如果大部分用户是移动用户,用数据推送


ifame

https://www.jb51.net/article/116273.htm

event source

https://segmentfault.com/a/1190000009276347

  • 代码实现
var express = require('express')
var fs = require('fs')
var app = express()

app.get('/count', function(req, res) {
    console.log(111)

    res.writeHead(200, {
        "Content-Type":"text/event-stream", 
        "Cache-Control":"no-cache", 
    });
    let count = 0

    interval = setInterval(function() {
        res.write("data: " + (++count) + "\n\n");
    }, 3000);

    req.connection.addListener("close", function () {
        clearInterval(interval);
    }, false);
})

app.use(function(req, res) {
    fs.readFile('./static/test.html', 'utf8',function(err, html) {
        if (err) {
            console.log(err)
            return
        }
        res.send(html)
    })
})

app.listen(4000, function(err) {
    if (err) {
        console.log(err)
        return
    }
    console.log('listening on port 4000')
})



  • 短轮训
定时器,发http请求

缺点:
1 固定频率发请求,数据可能没更新,浪费带宽,
2 假死状态,主线程遇到大量任务,导致setTimeout未按时执行发请求,无法响应


  • 长轮询
同样是定时发请求,只是服务端不会立即返回数据而已
等数据更新才返回

缺点:
1、保持连接会消耗资源。
2、服务器没有返回有效数据,程序超时。
  • iframe

1、IE、Mozilla Firefox会显示加载没有完成,图标会不停旋转。

2、服务器维护一个长连接会增加开销


参考文章

https://www.jianshu.com/p/ef054d3d1b62

05-10
<think>好的,我现在需要处理用户关于SSE(Server-Sent Events)的查询。首先,用户提供的引用内容中有三个关于SSE的参考资料,我需要仔细分析这些内容以确保回答的准确性。用户可能希望了解SSE的基本概念、工作原理、实现方式以及应用场景。 首先,根据引用[1]和[2],SSE是一种基于HTTP的协议,允许服务器向客户端单向推送数据,适用于需要实时更新但不需要客户端频繁发送请求的场景。引用[3]提供了一个完整的代码示例,展示了前端如何使用EventSource对象连接SSE流,并处理不同的事件和错误。这些信息是构建回答的基础。 接下来,我需要确保回答结构清晰,分点说明SSE的核心特性、工作原理、使用场景以及优缺点。同时,根据用户之前的示例,可能需要生成相关问题,比如性能优化、安全性或与其他技术的对比。 需要检查是否有遗漏的关键点,例如SSE与WebSocket的区别,这在用户提供的引用中没有提到,但通常是常见问题,应该包含在回答中。此外,引用中的代码示例可以帮助解释前端实现,但可能需要补充服务器端的实现步骤,如设置HTTP响应头为text/event-stream,保持连接打开等。 还要注意用户提到的系统级指令,比如数学公式的格式,但在这个主题中可能不涉及数学公式,所以可以忽略。确保使用中文回答,并且语言自然流畅,避免技术术语过多,同时保持专业性。 最后,生成的相关问题需要与SSE紧密相关,例如协议细节、断线重连机制、安全性或实际应用案例。需要确保问题覆盖用户可能感兴趣的各个方面,帮助他们进一步探索该技术。</think>### Server-Sent Events(SSE)详解 Server-Sent Events(SSE)是一种基于 HTTP 的轻量级协议,用于实现服务器向客户端**单向实时数据推送**。它通过 HTTP 长连接持续传输事件流(`text/event-stream`),适用于需要实时更新但客户端无需频繁发送请求的场景,例如新闻推送、股票行情、实时日志监控等[^1][^2]。 --- #### 一、核心特性 1. **单向通信**:仅支持服务器到客户端的单向数据推送。 2. **基于 HTTP**:无需额外协议,兼容现有基础设施。 3. **自动重连**:客户端内置断线重连机制。 4. **简单协议格式**:事件流以明文格式传输,包含 `data`、`event`、`id` 等字段[^1]。 --- #### 二、工作原理 1. **客户端建立连接** 使用 `EventSource` 对象连接服务器端点: ```javascript const eventSource = new EventSource('/sse-stream'); ``` 2. **服务器响应配置** 服务器需设置响应头为 `Content-Type: text/event-stream`,并保持连接开放: ```http HTTP/1.1 200 OK Content-Type: text/event-stream Connection: keep-alive ``` 3. **事件流格式** 服务器发送的数据遵循特定格式,例如: ```plaintext event: custom data: {"count": 42} data: 这是一条默认事件消息 ``` 4. **客户端事件监听** 前端通过回调处理不同事件类型: ```javascript // 默认事件 eventSource.onmessage = (e) => { console.log(e.data); }; // 自定义事件 eventSource.addEventListener('custom', (e) => { const data = JSON.parse(e.data); }); // 错误处理 eventSource.onerror = (error) => { /* 重连逻辑 */ }; ``` --- #### 三、使用场景 1. **实时通知**:用户消息提醒、系统告警。 2. **数据监控**:服务器状态、IoT 设备数据流。 3. **动态内容更新**:新闻头条、社交媒体动态。 --- #### 四、与 WebSocket 的对比 | 特性 | SSE | WebSocket | |--------------------|------------------------------|-------------------------| | 通信方向 | 单向(服务器→客户端) | 双向 | | 协议复杂度 | 基于 HTTP,无需额外握手 | 独立协议,需升级连接 | | 断线重连 | 自动支持 | 需手动实现 | | 数据格式 | 文本(`text/event-stream`) | 二进制或文本 | --- #### 五、局限性 1. **单向通信限制**:无法实现客户端到服务器的实时交互。 2. **并发连接数限制**:浏览器对同一域名的 SSE 连接数有限制(通常为 6 个)。 3. **老浏览器兼容性**:IE/Edge 旧版本不支持 `EventSource`[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值