SSE实现deepseek流式输出

前置条件

用到的框架vite,node、express和JS(可以使用nvm控制node版本,方便切换)

我们先把框架搭建起来(vite使用的版本需要在node18及以上)

这时,我们可以看到,node已添加到文件夹里面

我们在package里面声名dev,启动vite。

SSE简介

  • SSE(Server-Sent Events)译为服务器推送事件,通过EventSource接口实现服务器推送通信。
  • EventSource 实例会对 HTTP 服务器开启一个持久化的连接,以 text/event-stream 格式发送事件

进入主题

开头

一个延伸问题,如果马云做一个数据大屏,但是不需要前端传递,这个时候应该怎么做?

webSocket和SSE

区别:

  1. webSocket全双工通信 SSE单工通信
  2. webSocket默认是不会重连的,SSE默认自动了重连机制

前后端实时通讯的所有方法

  1. 轮询ajax
  2. 前端的mqtt 底层也是webSocket
  3. WebTransport(new api,目的是为了代替webSocket)

webSocket TCP 三次握手以及四次挥手

WebTransport 是基于UDP 并且基于http3

不想记概括版:UDP快,TCP慢

  1. http2,被谷歌下架了(103版本)

底层实现

我们进入index.js,使用express搭建

  • Content-Typetext/event-stream来开启SSE
  • 连接状态Connectionkeep-alive
  • 实时推送需要设置Cache-Controlno-cahce停用缓存

get

发送请求

只有write才能发送数据流,其他发不了。

监听端口

运行

默认接收的是一个message,但是可以修改(要加\n,不然到tcp层解析不了)

实现打字机效果

创造盒子

post

arduino 复制代码
async function startSSE() {
    const response = await fetch('http://localhost:3000/sse', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            message: 'Hello, SSE!'
        })
    })

    const reader = response.body?.getReader()

    //{done:false,value:Uint8Array} done false表示未结束 true表示结束 value就是unit8array
    //unit8array二进制数据 这是因为为了让我们开发者调试用的 底层是二进制
    //String.fromCharCode(118) 通过这个方法查看
    //ASCII 编码
    //TC39组织设计API filter promise TextDecoder 转成文本
    while (true) {
        const { done, value } = await reader!.read()
        if (done) break
        const text = new TextDecoder().decode(value)
        const arr = text.split('\n')
        arr.pop()
        arr.pop()
        for (const line of arr) {
            if (line.startsWith('data:')) {
                console.log(line.split(': ')[1])
                content.innerHTML += line.split(': ')[1]
            }
        }
    }

}


startSSE()

总结

底层原理已经明白了,我们可以使用封装好的组件(微软的sse)

javascript 复制代码
import { fetchEventSource } from '@microsoft/fetch-event-source';
fetchEventSource('http://localhost:3000/sse',{
    method:'POST',
    headers:{
        'Content-Type':'application/json'
    },
    body:JSON.stringify({message:'Hello, SSE!'}),
    onmessage:(event)=>{
        console.log(JSON.parse(event.data))
    },
    onerror:(event)=>{
        console.log(event)
    }
})

可能存在跨域问题(?)

使用cors

相关推荐
MK-mm18 分钟前
CSS盒子 flex弹性布局
前端·css·html
小小小小宇30 分钟前
CSP的使用
前端
sunbyte31 分钟前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | AnimatedNavigation(动态导航)
前端·javascript·vue.js·tailwindcss
ifanatic41 分钟前
[每周一更]-(第147期):使用 Go 语言实现 JSON Web Token (JWT)
前端·golang·json
烛阴41 分钟前
深入浅出地理解Python元类【从入门到精通】
前端·python
米粒宝的爸爸44 分钟前
uniapp中vue3 ,uview-plus使用!
前端·vue.js·uni-app
JustHappy1 小时前
啥是Hooks?为啥要用Hooks?Hooks该怎么用?像是Vue中的什么?React Hooks的使用姿势(下)
前端·javascript·react.js
董先生_ad986ad1 小时前
C# 解析 URL URI 中的参数
前端·c#
江城开朗的豌豆2 小时前
Vue中Token存储那点事儿:从localStorage到内存的避坑指南
前端·javascript·vue.js
江城开朗的豌豆2 小时前
MVVM框架:让前端开发像搭积木一样简单!
前端·javascript·vue.js