返回

ChatGPT再现"打字机"流式回复,SSE&WebSocket技术助力实时交互

前端

ChatGPT 的流式回复:SSE 和 WebSocket 的完美结合

服务器主动推送数据:SSE

SSE(服务器主动推送事件)是一种强大且简单的技术,可让服务器向浏览器主动推送数据。它通过向浏览器不断发送消息来实现实时数据更新,无需浏览器反复向服务器发送请求。

全双工通信:WebSocket

WebSocket 是一种双向通信技术,建立浏览器和服务器之间的持久连接。双方可以随时向对方发送和接收数据,实现实时交互。

ChatGPT 中 SSE 和 WebSocket 的完美结合

ChatGPT 巧妙地融合了 SSE 和 WebSocket 技术,实现了流式回复。当用户发送请求时,ChatGPT 通过 SSE 向用户推送中间结果,最后通过 WebSocket 发送最终结果。这种方法不仅实现实时交互,还避免了用户的长时间等待。

体验 ChatGPT 的流式回复

要体验 ChatGPT 的流式回复,请使用支持 SSE 和 WebSocket 的浏览器访问 ChatGPT 的网页端。输入问题后,ChatGPT 会立即开始生成回复,逐字逐句地输入到聊天框中,就像打字机在敲击键盘一样。这种流式回复方式不仅有趣,还能及时了解 ChatGPT 的思考过程。

SSE 和 WebSocket 技术的广泛应用

除了 ChatGPT 之外,SSE 和 WebSocket 技术还广泛应用于其他领域,包括:

  • 在线聊天: 实时聊天,用户可以立即收到对方消息。
  • 实时数据更新: 股票价格、体育赛事比分等数据的实时更新。
  • 在线游戏: 在线游戏的实时交互,玩家及时收到游戏数据。
  • 物联网 (IoT): 物联网设备与服务器之间的实时通信,服务器及时接收设备数据并发送控制指令。

代码示例

# 使用 SSE 推送实时数据
from flask import Flask, render_template, Response
from flask_sse import sse

app = Flask(__name__)
app.config["REDIS_URL"] = "redis://localhost:6379"

sse = sse.SSE(app)

@app.route("/stream")
def stream():
    # 定义事件源
    def event_stream():
        while True:
            # 从数据库获取数据
            data = get_data_from_db()
            # 发送数据事件
            yield sse.event(data=data)
            # 设置时间间隔,单位为秒
            time.sleep(1)

    # 响应事件源
    return Response(event_stream(), mimetype="text/event-stream")
# 使用 WebSocket 进行双向通信
import socket

# 创建 WebSocket 客户端
ws = new WebSocket("ws://localhost:8080/websocket");

# 当连接建立时
ws.onopen = function() {
    // 发送消息到服务器
    ws.send("Hello from client!");
};

# 当收到服务器消息时
ws.onmessage = function(e) {
    // 处理服务器消息
    console.log("Received: " + e.data);
};

# 当连接关闭时
ws.onclose = function() {
    // 连接已关闭
    console.log("Connection closed.");
};

常见问题解答

  • SSE 和 WebSocket 有什么区别?

    • SSE 仅用于服务器向浏览器推送数据,而 WebSocket 允许双向通信。
  • 我如何知道浏览器是否支持 SSE 和 WebSocket?

    • 使用 window.EventSourcewindow.WebSocket 检查是否支持 SSE 和 WebSocket。
  • SSE 和 WebSocket 的延迟如何?

    • 延迟取决于网络状况,但 SSE 和 WebSocket 通常比传统的 HTTP 请求具有更低的延迟。
  • 我可以使用 SSE 和 WebSocket 构建哪些类型的应用程序?

    • 实时聊天、实时数据更新、在线游戏、物联网应用程序。
  • 为什么使用 SSE 和 WebSocket 而不是轮询?

    • 轮询需要浏览器不断向服务器发送请求,而 SSE 和 WebSocket 可以实现服务器主动推送数据或实时交互,从而降低服务器负载并提高效率。