计算机基础协议/概念:推送数据— —WebSocket与SSE;前端Blob/URL下载文件

计算机基础协议/概念:推送数据— —WebSocket与SSE

1 WebSocket:双向通信

1.1 概念:通信过程

在这里插入图片描述

①Upgrade:浏览器告知服务器升级为WebSocket协议
②Switch:服务器升级成功后会返回101状态码
③Communicate:浏览器和服务器就可以以WebSocket格式发送数据

1.2 实战:实现简易聊天室

WebSocket实战:实现简易聊天室

2 SSE(Server Send Event):服务器单项推送消息,text/event-stream

在这里插入图片描述

2.1 概念:特点

①服务端返回的Content-Type:text/event-stream

这是一个流,可以返回多次内容

  • Server Send Event就是通过这种消息来随时推送数据

在这里插入图片描述

2.2 应用场景

①CICD平台实时打印日志

CICD平台需要实时打印日志,那么它的日志是如何实现实时打印的呢?

  • 这种明显需要一段一段的传输数据,一般就是用SSE来推送数据
②ChatGPT回答框:一部分一部分加载回答

ChatGPT的回答不是一次性给全部的,而是一部分一部分的加载回答

在这里插入图片描述

拓展:前端下载文件的方式Blob下载、URL下载

  • Blob下载适用于需要动态生成文件内容的场景,比如将前端生成的数据导出为文件,如导出Excel、导出PDF等。
  • 浏览器URL直接下载适用于已经存在于服务器上的文件下载,比如用户下载软件安装包、下载图片、下载文档等。

1. 加载URL(location.href):可以下载浏览器无法预览的文件(.tar等)

对于浏览器不能打开的文件(例如:.rar .doc等)是可以实现文件下载的,但是对于浏览器可以打开的(例如:.txt .xml等)只可以实现预览功能

  • location.href
  • window.open
  • a标签
window.location.href="https://106.14.15.103:8000/downloadFile/test"

上述三种都是通过加载文件url直接下载,如果后端返回文件流,则需要先转化为url再下载;
另外上述三种方式默认是get方式,如果需要使用post方式且需传参,最好使用下面文件流方式

2. 文件流下载(后端返回文件流转为blob)

现在有一个需求,文件下载,但需要鉴权,这就意味着不能用后台返回下载链接的方式进行下载,因为一旦被别人拿到这条链接,就可以不需要任何权限就直接下载,因此需要换种思路,那么就需要用到blob(binary large object)对象,就是下面的这种方式

1.ajax请求将文件流下载下来
2.将下载的文件流转化为blob数据
3.通过 window.URL.createObjectURL(blob)将blob转化为url
4.通过动态生成a标签 模拟点击事件下载

Blob使用场景:

  • 大文件分片上传
this.$http({
   url: this.$http.adornUrl(`/strUrl/${id}`),
   method: 'get',
   responseType: 'blob',
   timeout: 1000 * 600
 }).then(res => {
   console.log('res', res)
   if (res.status === 200) {
     const blob = new Blob([res.data], { type: `application/octet-stream` })
     const downloadElement = document.createElement('a')
     const href = window.URL.createObjectURL(blob)
     downloadElement.href = href
     downloadElement.download = `${filename}`
     downloadElement.click()
   } else {
     this.$message.error('下载出错!')
   }
 })

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

3. 二者区别

  1. 返回URL: 当后端返回一个URL时,实际上是将文件存储在服务器上,并将文件的URL返回给前端。前端通过访问该URL来下载文件。这种方式需要确保服务器上的文件访问权限设置正确,以防止未授权用户访问文件。
  2. 返回二进制流: 当后端直接返回二进制流时,前端可以将二进制数据保存为Blob对象,并通过Blob下载的方式将文件保存到本地。这种方式不需要将文件存储在服务器上,可以动态生成文件内容,对于一些敏感数据,可以避免在服务器上存储。
  • 相比于返回URL,Blob下载具有以下优势,从而提供了更高的安全性:
  • 避免敏感数据存储在服务器上: 使用Blob下载可以避免将敏感数据存储在服务器上,减少了数据泄露的风险。
  • 动态生成文件内容: Blob下载可以动态生成文件内容,这意味着可以将非文件类型的数据(如图表、报表等)直接生成为文件进行下载,而不需要在服务器上事先存在该文件。
  • 临时性: Blob对象是临时的,只存在于浏览器的内存中,不会在本地永久保存。这可以减少文件被他人恶意获取的风险。
3.1 URL:静态文件下载、文件共享

返回URL使用场景:

静态文件下载:适用于需要访问和下载已经存在于服务器上的静态文件,如图片、文档、软件安装包等。
文件共享:可以将文件存储在服务器上,并通过URL分享给其他用户下载。

3.2 Blob:前端数据导出文件excel等、数据加密

返回Blob场景:

动态文件下载:适用于需要动态生成文件内容的场景,比如将前端生成的数据导出为文件,如导出Excel、导出PDF等。
数据加密:可以将敏感数据加密后返回给前端,前端可以将加密后的数据保存为Blob对象进行下载。

参考:https://blog.youkuaiyun.com/qq_40298902/article/details/121779944

03-29
<think>好的,我现在要帮用户查找sse.js相关的技术资料或实现方法。首先,我需要理解用户的需求。用户提到“sse.js”,可能是指某个特定的JavaScript库,用于实现Server-Sent Events(SSE)功能。SSE是一种允许服务器向客户端实时推送数据的技术,基于HTTP协议,常用于实时更新网页内容,比如新闻推送、股票行情等。 接下来,我需要回顾用户提供的引用内容,看看是否有相关线索。引用1和2提到了在Play Framework和HTML中使用EventSource的示例代码,引用3是关于SSE消息格式的说明,引用4是Django的SSE集成库,引用5则涉及OAuth模块,似乎SSE无关。 用户可能需要sse.js的具体实现文档或使用方法。根据现有资料,首先应该确认是否有名为sse.js的官方库。但根据我的知识,原生JavaScript已经支持EventSource API,所以可能不需要额外的库。不过,有些开发者可能会封装成库,比如用于处理兼容性或提供额外功能。 在引用4中提到的django-sse库是用于Django框架的SSE集成,可能不是用户需要的JavaScript部分。用户可能需要纯前端的实现方法,或者某个特定的sse.js库的文档。 接下来,我应该检查用户提供的引用是否有相关内容。引用2中的HTML示例展示了如何使用原生EventSource,这属于浏览器内置API,不需要引入外部库。但用户提到sse.js,可能是指某个特定的实现,比如某个GitHub项目或第三方库。 可能需要进一步考虑,用户可能混淆了sse.js和其他类似的库。例如,有些库可能提供对旧版浏览器的polyfill,如引用1中的eventsource.js,这可能是一个polyfill,用于支持不支持EventSource的浏览器。比如,Remy的EventSource polyfill是一个常用选择,但用户提到的文件名是eventsource.js,可能某个特定项目相关。 另外,查看引用3中的SSE消息结构,用户可能需要了解如何正确解析服务器发送的事件数据。例如,消息格式中的event: message和data字段的处理方法。 综合来看,用户可能需要两方面的信息:一是如何使用原生JavaScript实现SSE,二是是否有相关的第三方库或polyfill。根据引用1中的代码,用户可能已经使用了某个polyfill库(如eventsource.js),而引用2展示了原生的使用方式。 因此,回答中应包含原生EventSource的使用方法,如创建EventSource对象、监听事件,同时提及可能需要polyfill的情况,并推荐相关的库,比如Remy的EventSource polyfill或django-sse等后端集成方案。此外,需要根据引用中的示例代码,说明如何在实际项目中应用这些方法,例如在Play Framework或Django中的配置。 还需要注意用户提到的sse.js可能是指某个具体的项目,但如果没有找到确切匹配的,可能需要建议用户检查是否名称有误,或者直接使用原生API。同时,提供相关文档链接,如MDN的EventSource文档,以及GitHub上的polyfill项目,帮助用户进一步查阅。 最后,生成相关问题,引导用户深入探讨SSE的实现细节、兼容性处理、其他技术的对比(如WebSocket),以及在不同框架中的集成方法。</think>根据您提供的引用内容和需求,以下是关于Server-Sent Events(SSE)的实现方法和技术资料整理,结合了原生JavaScript实现和框架集成方案: ### 一、原生JavaScript实现SSE 1. **基础实现** 浏览器原生支持`EventSource` API(HTML5标准),可直接使用: ```javascript const source = new EventSource('serverevents'); // 服务器端点 source.onmessage = function(event) { document.getElementById('events').innerHTML += event.data; }; ``` 此代码会监听服务器发送的实时数据(如引用2的示例)[^2]。 2. **事件类型处理** 支持自定义事件类型(如引用3中的`event: message`): ```javascript source.addEventListener('message', function(event) { const data = JSON.parse(event.data); // 解析JSON数据 console.log(data.result.serverInfo.name); // 输出"mem0-mcp" }); ``` ### 二、SSE技术文档兼容性处理 1. **Polyfill方案** 若需兼容旧版浏览器(如IE),需引入Polyfill库: ```html <script src="/assets/javascripts/vendor/eventsource.js"></script> <!-- 如引用1 --> ``` 推荐使用[Remy's EventSource Polyfill](https://github.com/remy/polyfills/blob/master/EventSource.js)[^1]。 2. **SSE协议规范** - 数据格式要求:每条消息以`data:`开头,结尾需两个换行符`\n\n` - 服务器响应头需包含`Content-Type: text/event-stream` ### 三、框架集成方案 1. **Django后端集成** 使用`django-sse`库实现SSE推送(引用4): ```python # urls.py urlpatterns = [ url(r'^stream/$', RedisQueueView.as_view(redis_channel="channel"), name="stream"), ] ``` 需配合Redis等消息队列实现异步推送[^4]。 2. **Play Framework示例** 前端通过固定端点订阅事件(引用1、2): ```html <!-- 前端订阅路径需路由配置匹配 --> <script> const source = new EventSource('/serverevents'); </script> ``` ### 四、进阶应用 1. **安全增强** 结合OAuth2进行身份验证(引用5): ```javascript fetch('serverevents', { headers: { 'Authorization': 'Bearer ' + accessToken } }); ``` 需在服务器端验证令牌[^5]。 2. **性能优化** - 使用`last-event-id`实现断线重连 - 限制并发连接数(浏览器默认每个域名最多6个SSE连接)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值