【日常记录】【JS】SSE 流式传输 ChatGPT 的网络传输模式

文章目录

    • [1、SSE 流式传输](#1、SSE 流式传输)
    • 2、后端代码
    • 3、前端代码
    • [5、SSE和WS 对比](#5、SSE和WS 对比)
    • [6、chatgpt SSE的服务端返回的数据](#6、chatgpt SSE的服务端返回的数据)
    • 参考链接

单工通信是一种单向的通信方式,其中信息只能从发送端传输到接收端,而接收端不能向发送端发送任何信息。在Web开发中,Server-Sent Events (SSE) 是一种实现单工通信的技术,允许服务器将更新数据推送到客户端

1、SSE 流式传输

SSE是一种由HTML5引入的技术,用于在服务器和浏览器之间创建持久的单向连接。通过这种连接,服务器可以不断地向浏览器推送数据,而不需要客户端轮询服务器以获取更新。SSE使用HTTP协议,并且在浏览器端使用EventSource对象来接收服务器发送的事件。
chatgpt 的 问题回答, 就是用的这种方式


  • 优点:
    • 简单易用,使用标准HTTP协议。
    • 在许多现代浏览器中都有良好的支持。
    • 对于实时更新的应用,如新闻推送、股票行情、聊天系统、倒计时同步、实时天气等非常适用。
  • 缺点:
    • 单向通信,客户端无法向服务器发送数据(适合使用WebSocket)。
    • 不适合传输大量数据或需要双向通信的应用。

2、后端代码

  1. 采用 express 起一个服务
  2. cors 处理跨域问题
  3. 设置SSE 技术必要的响应头

在向前端传输数据的时候, res.write 里面的东西 如若有变量啥的,一定要转化成字符串
SSE 响应主要由一系列以两个换行符分隔的事件组成。每个事件可以包含以下字段:

  • data:事件的数据。如果数据跨越多行,每行都应该以data:开始。
  • id:事件的唯一标识符。客户端可以使用这个ID来恢复事件流。
  • event:自定义事件类型。客户端可以根据不同的事件类型来执行不同的操作。
  • retry:建议的重新连接时间(毫秒)。如果连接中断,客户端将等待这段时间后尝试重新连接。
js 复制代码
const express = require("express");
const cors = require("cors");

const app = express();

app.use(cors());
function formatDate() {
  const now = new Date();

  const year = now.getFullYear();
  const month = now.getMonth() + 1; // getMonth() 返回 0-11,需要 +1
  const day = now.getDate();
  const hours = now.getHours();
  const minutes = now.getMinutes();
  const seconds = now.getSeconds();

  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

app.use(express.static("public"));

app.get("/events", function (req, res) {
  // 必要的一些响应头配置
  res.setHeader("Content-Type", "text/event-stream");
  res.setHeader("Cache-Control", "no-cache");
  res.setHeader("Connection", "keep-alive");
  res.header("Access-Control-Allow-Origin", "*"); // 允许所有来源

  let count = 1;
  let intervalInstance = setInterval(() => {
    if (count == 10) {
      res.write(
        `data:${JSON.stringify({
          data: formatDate(),
          count: count,
        })}\n\n`
      ); // 发送一个特殊事件通知客户端关闭
      res.end();
      clearInterval(intervalInstance);
      return;
    }

    res.write(
      `data: ${JSON.stringify({
        data: formatDate(),
        count: count,
      })}\n\n`
    );

    count++;
  }, 2000);
});

app.listen(3000, () => {
  console.log(`http://localhost:3000`);
});

3、前端代码

每次接收后端返回值结构如下


html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />

  <title></title>
</head>

<body>
  <h1>Server-SentEvents</h1>

  <div id="container"></div>

  <script>
    const evtSource = new EventSource("http://127.0.0.1:3000/events");
    const container = document.getElementById("container");

    evtSource.onmessage = function (event) {
      console.log(event, JSON.parse(event.data));
      let data = JSON.parse(event.data)

      if (data.count == 10) {
        evtSource.close();

      }
      const pEl = document.createElement("p");

      pEl.innerHTML = data.data + '       次数' + data.count
      container.appendChild(pEl);
    };

  </script>
</body>

</html>

##4、实际效果

5、SSE和WS 对比

WebSocket:是全双工通信

特性/因素 SSE WS(WebSocket)
协议 基于HTTP,使用标准HTTP连接 单独的协议(ws:// 或 wss://),需要握手升级
通信方式 单向通信(服务器到客户端) 全双工通信
数据格式 文本(UTF-8编码) 文本或二进制
重连机制 浏览器自动重连 需要手动实现重连机制
实时性 高(适合频繁更新的场景) 非常高(适合高度交互的实时应用)
浏览器支持 良好(大多数现代浏览器支持) 非常好(几乎所有现代浏览器支持)
适用场景 实时通知、新闻feed、股票价格等需要从服务器推送到客户端的场景 在线游戏、聊天应用、实时交互应用
复杂性 较低,易于实现和维护 较高,需要处理连接的建立、维护和断开
兼容性和可用性 基于HTTP,更容易通过各种中间件和防火墙 可能需要配置服务器和网络设备以支持WebSocket
服务器负载 适合较低频率的数据更新 适合高频率消息和高度交互的场景

6、chatgpt SSE的服务端返回的数据

这里他其实返回的是 unicode编码的字符

参考链接

相关推荐
CodeCraft Studio4 小时前
3D文档控件Aspose.3D实用教程:使用 C# 构建 OBJ 到 U3D 转换器
开发语言·3d·c#·3d渲染·aspose·3d文件格式转换·3d sdk
胡gh4 小时前
页面卡成PPT?重排重绘惹的祸!依旧性能优化
前端·javascript·面试
superlls4 小时前
(Redis)主从哨兵模式与集群模式
java·开发语言·redis
胡gh4 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
言兴4 小时前
# 深度解析 ECharts:从零到一构建企业级数据可视化看板
前端·javascript·面试
山有木兮木有枝_4 小时前
TailWind CSS
前端·css·postcss
烛阴5 小时前
TypeScript 的“读心术”:让类型在代码中“流动”起来
前端·javascript·typescript
杨荧5 小时前
基于Python的农作物病虫害防治网站 Python+Django+Vue.js
大数据·前端·vue.js·爬虫·python
chenglin0165 小时前
C#_gRPC
开发语言·c#
未来之窗软件服务5 小时前
浏览器开发CEFSharp+X86+win7(十三)之Vue架构自动化——仙盟创梦IDE
架构·自动化·vue·浏览器开发·仙盟创梦ide·东方仙盟