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

相关推荐
benbenAItalk8 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885728 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12349 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易11 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周11 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师12 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9812 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan12 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡12 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒13 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端