sse简单介绍

sse fetch-event-source插件的使用https://blog.csdn.net/weixin_42400404/article/details/141896061?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22141896061%22%2C%22source%22%3A%22weixin_42400404%22%7D

严格意义上,HTTP协议服务器无法主动发送消息,但是可以转换成发送流信息;

sse就是利用这种机制,使用流信息的方式向浏览器发送信息,基于HTTP协议;

1.区别

sse和websocket很相似,都是建立服务器与浏览器之前的通信渠道,服务器向浏览器推送消息。

websocket更强大,它支持双向推送信息;sse只能单向通信,服务器向浏览器推送流消息,本质上为下载;

2.特点

  • sse是HTTP协议,现有的服务器软件都支持,websocket是独立的协议;

  • sse轻量级,使用简单,websocket协议相对复杂;

  • sse支持断线重连,websocket需要自己处理;

  • sse一般只用来传送文本,二进制数据需要编码后传送,websocket默认支持二进制数据;

  • sse支持自定义发送的消息类型

3.客户端Api

sse的客户端API部署在EventSource对象上

检查浏览器是否支持sse(浏览器基本都支持)

javascript 复制代码
if ('EventSource' in window) {
  // ...
}

3.1案例一:

javascript 复制代码
var source = new EventSource('http://127.0.0.1:8844/stream');
var div = document.getElementById('example');
​
source.onopen = function (event) {
    div.innerHTML += '<p>Connection open ...</p>';
};
​
source.onerror = function (event) {
    div.innerHTML += '<p>Connection close.</p>';
};
​
source.addEventListener('connecttime', function (event) {
    div.innerHTML += ('<p>Start time: ' + event.data + '</p>');
}, false);
​
source.onmessage = function (event) {
    div.innerHTML += ('<p>Ping: ' + event.data + '</p>');
};
  
// 关闭连接
source.close()

根据EventSource实例上的readyState属性,获取当前的连接状态,只读

  • 相当于常量EventSource.CONNECTING,表示连接还未建立,或者断线正在重连。

  • 相当于常量EventSource.OPEN,表示连接已经建立,可以接受数据。

  • 相当于常量EventSource.CLOSED,表示连接已断,且不会重连。

4.服务器

javascript 复制代码
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

每一次发送的信息,由若干个message组成,每个message之间用\n\n分隔。每个message内部由若干行组成,每一行都是如下格式。

javascript 复制代码
[field]: value\n

前端接收的的message数据是json格式,需要JSON.parse转下

  • data 内容
  • event 事件类型,默认是message,可以使用addEventListener()监听该事件
  • id 数据标识符
  • retry 服务器可以通过该字段,指定浏览器重新发起连接的时间间隔

4.1返回案例

javascript 复制代码
{
    "data": "{\"msg\":helloworld哈哈哈哈哈}",
    "event": "message",
    "id": ""
    "retry":""
}

导致浏览器重新发起请求的原因

  • 时间间隔到期

  • 网络错误

参考文件:

仅供参考

相关推荐
l_tian_tian_5 分钟前
JavaWeb——Ajax、Element、打包部署
前端·javascript·ajax
moskidi6 分钟前
Web day02 Js & Vue & Ajax
前端·javascript·vue.js
星月昭铭7 分钟前
浏览器控制台中使用ajax下载文件(没有postman等情况下)
前端·chrome·ajax·postman
花下的晚风9 分钟前
vue3 发送 axios 请求时没有接受到响应数据
前端·javascript·vue.js
天农学子1 小时前
elementui el-input修改字体样式
前端·javascript·css·elementui
Sword991 小时前
【ThreeJs原理解析】第3期 | 射线检测Raycaster实现原理
前端·three.js·源码阅读
布兰妮甜2 小时前
Zustand:一个轻量级的React状态管理库
前端·react.js·zustand
Beekeeper&&P...2 小时前
@RequestBody和前端的关系以及,如何在前后端之间传递数据?
java·前端
h周杰偷3 小时前
vue 预览pdf 【@sunsetglow/vue-pdf-viewer】开箱即用,无需开发
前端·vue.js·pdf
小孙姐3 小时前
3——VUE侦听器和计算属性
前端·javascript·vue.js