当前位置: 首页 > news >正文

SSE:用于流式传输的协议

一.什么是SSE

        SSE协议是一种基于http协议的单向通信协议,服务端可以向客户端发送数据,但是客户端不能向服务器发送数据。客户端通过创建一个到服务器的单向连接来监听事件。可以将一次性返回数据包改为流式返回数据。SSE协议支持断线重连,也支持自定义响应事件。比如ChatGpt使用的通信方式就是SSE协议,相比于websocket通信这是一个更为轻量级的通信方式,使用方法简单。但是在浏览器原生的EventSource不支持设置请求头,需要借助第三方包去实现,同时也需要后端设置接口的响应头Content-Type:text/event-stream

二.SSE和WebSocket的区别

        WebSocket  API

           WebSocket是基于TCP协议的一种用于应用层的网络协议,它实现了浏览器与服务器之间的全双工通信,它允许服务器主动发信息给客户端。所以,浏览器和服务器只需要完成一次握手就可以建立持久性的连接,并且能够实现双向数据传输。

        特点:

          1.传输的数据格式可以是文本也可以是二进制形式

          2.不受同源策略的限制,可以与任意服务端进行通信

          3.兼容HTTP协议,默认端口同样是80(ws)和443(ws)

          4.客户端和服务端通信时开销较少,与HTTP协议不同,不需要每次都携带完整的头部信息

          5.若在通信过程中连接中断,需要自己实现断线重连

        区别:

          1.sse协议仅支持服务端向客户端发送数据,而websocket支持双向通信,服务端和客户端之间可以互相通信

          2.sse是一种轻量级的通信协议,而websocket整体的一些方法事件较为复杂

          3.sse支持断线重连机制,而websocket需要自己实现断线重连

          4.sse是基于HTTP协议的通信协议,而websocket是基于TCP协议的网络层通信协议

三.前端使用SSE

 <h1>fetchSSE Demo</h1>
    <button onclick="connectFetch()">建立 fetchSSE 连接</button>
    <button onclick="closeSSE()">断开 fetchSSE 连接</button>
    <br />
    <br />
    <div id="message"></div>
    <script>
        const messageElement = document.getElementById('message')
        let controller = null
        // 建立 FETCH-SSE 连接
        const connectFetch = () => {
            controller = new AbortController()
            fetchEventSource('http://127.0.0.1:3001/fetch-sse', {
                method: 'POST',
                body: JSON.stringify({
                    content: 'xxx'
                }),
                signal: controller.signal,
                onopen: () => {
                    messageElement.innerHTML += `FETCH 连接成功<br />`
                },
                onclose: () => {
                    messageElement.innerHTML += `FETCH 连接关闭<br />`
                },
                onmessage: (event) => {
                    const data = JSON.parse(event)
                    messageElement.innerHTML += `${data.id} --- ${data.time} --- body参数:${JSON.stringify(data.body)}` + '<br />'
                },
                onerror: (e) => {
                    console.log(e)
                }
            })
        }

        // 断开 FETCH-SSE 连接
        const closeSSE = () => {
            if (controller) {
                controller.abort()
                controller = undefined
                messageElement.innerHTML += `FETCH 连接关闭<br />`
            }
        }
        const fetchEventSource = (url, options) => {
            fetch(url, options)
                .then(response => {
                    if (response.status === 200) {
                        options.onopen && options.onopen()
                        return response.body
                    }
                })
                .then(rb => {
                    const reader = rb.getReader()
                    const push = () => {
                        // done 为数据流是否接收完成,boolean
                        // value 为返回数据,Uint8Array
                        return reader.read().then(({ done, value }) => {
                            if (done) {
                                options.onclose && options.onclose()
                                return
                            }
                            options.onmessage && options.onmessage(new TextDecoder().decode(value))
                            // 持续读取流信息
                            return push()
                        })
                    }
                    // 开始读取流信息
                    return push()
                })
                .catch((e) => {
                    options.error && options.error(e)
                })
        }

        

        
        

相关文章:

  • 百度热力图数据获取,原理,处理及论文应用6
  • Java 开发者需要了解的 PDF 基础知识
  • 安全防御综合练习2 nat+智能选路
  • 串的基本操作--数据结构
  • 算法日常刷题笔记(1)
  • 【数据分享】1929-2024年全球站点的逐日降雪深度数据(Shp\Excel\免费获取)
  • vLLM专题(二):安装-CPU
  • Retrofit+OkHttp+ViewModel
  • Go入门之语言变量 常量介绍
  • MongoDB 7 分片副本集升级方案详解(上)
  • CentOS 8 配置bond
  • C# 入门简介
  • Flutter 中的数据跨层传递方案
  • Qt之线程的创建与启动
  • 【JAVA工程师从0开始学AI】,第四步:闭包与高阶函数——用Python的“魔法函数“重构Java思维
  • 深入理解同步与异步I/O:从原理到实战
  • vue 判断字符串开头是http或者https
  • 2025-2-17算法打卡
  • 使用神经网络对驾驶数据进行道路类型分类
  • 《RCooper: 一个真实世界的大规模道路边协同感知数据集》学习笔记
  • 中国旅马大熊猫“福娃”和“凤仪”启程回国
  • 著名文博专家吴远明因交通事故离世,享年75岁
  • 农行再回应客户办理业务期间离世:亲属连续三次输错密码,理解亲属悲痛,将协助做好善后
  • 泽连斯基抵达安卡拉,称乌将派出最高级别代表团参与谈判
  • 美国与卡塔尔签署超2435亿美元经济及军事合作协议
  • 费高云不再担任安徽省人民政府副省长