首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ChatGPT逐字推送的秘密

ChatGPT逐字推送的秘密

作者头像
灬沙师弟
发布于 2023-07-08 08:55:10
发布于 2023-07-08 08:55:10
1.2K02
代码可运行
举报
文章被收录于专栏:Java面试教程Java面试教程
运行总次数:2
代码可运行

背景

面试官: 最近ChatGPT很火,他以聊天的形式把答案推送给你,你知道服务器逐字主动推送怎么做的吗?

了不起: 可以用Websocket协议来推送。

面试官: 还有其他方式吗?

了不起: 目前只知道这个

SSE协议

SSE(Server-Sent Events)是一种基于HTTP的服务器向客户端推送数据的机制。与WebSocket相比,SSE更加轻量级,适用于需要实时更新的Web应用程序。其通讯过程如下:

  1. 客户端向服务器发送一个HTTP请求,请求一个SSE连接。
  2. 服务器接受请求,返回一个HTTP响应,状态码为200 OK,并设置Content-Type为text/event-stream。
  3. 服务器将一系列事件发送到客户端。每个事件包含一个或多个字段,包括事件名、数据和可选的ID。这些事件通过HTTP响应的正文部分发送。
  4. 客户端通过持续连接保持连接打开,并接收服务器发送的事件。每个事件都以一个“data:”字段开头,后面跟着实际的数据。如果事件包含事件名称,则其名称以“event:”字段开头。如果事件包含ID,则其ID以“id:”字段开头。
  5. 客户端可以通过JavaScript代码监听SSE事件,以便在事件到达时执行某些操作。例如,可以使用EventSource对象的onmessage回调函数来处理收到的消息。
  6. 如果客户端希望关闭连接,可以发送一个HTTP请求,其中包含“Connection: close”头部。服务器将关闭连接,并停止向客户端发送事件。

代码实现

SseEmitter是一个Spring框架中的类,用于实现服务器发送事件(Server-Sent Events)的功能。它允许服务器向客户端发送一系列的数据,而无需客户端不断地发送请求。以下是使用SseEmitter实现的步骤:

  1. 创建一个SseEmitter对象,该对象将用于向客户端发送事件。
  2. 在SseEmitter对象上注册一个CompletionCallback,以便在SseEmitter关闭时执行一些操作。
  3. 在SseEmitter对象上调用send()方法,向客户端发送数据。
  4. 在需要时可以调用complete()方法或completeWithError()方法,以结束SseEmitter并关闭连接。

例如,以下代码演示了如何在Spring MVC中使用SseEmitter发送一个简单的消息:SseEmitter是一个Spring框架中的类,用于实现服务器发送事件(Server-Sent Events)的功能。它允许服务器向客户端发送一系列的数据,而无需客户端不断地发送请求。以下是使用SseEmitter实现的步骤:

  1. 创建一个SseEmitter对象,该对象将用于向客户端发送事件。
  2. 在SseEmitter对象上注册一个CompletionCallback,以便在SseEmitter关闭时执行一些操作。
  3. 在SseEmitter对象上调用send()方法,向客户端发送数据。
  4. 在需要时可以调用complete()方法或completeWithError()方法,以结束SseEmitter并关闭连接。

例如,以下代码演示了如何在Spring MVC中使用SseEmitter发送一个简单的消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping("/stream")
public SseEmitter stream() {
  SseEmitter emitter = new SseEmitter();
  try {
    emitter.send("Hello, world!");
    emitter.complete();
  } catch (IOException e) {
    emitter.completeWithError(e);
  }
  return emitter;
}

在这个例子中,我们创建了一个SseEmitter对象,并向客户端发送了一条消息。然后,我们调用了complete()方法,以结束SseEmitter并关闭连接。如果在发送消息时发生了任何错误,我们将调用completeWithError()方法,以关闭连接并抛出异常。

对比Websocket

SSE(Server-Sent Events)和Websocket都是用于实现服务器和客户端之间实时通信的技术,但它们有不同的优缺点,如下所述:

SSE的优点:

  1. SSE是基于HTTP协议的,因此可以穿透大多数防火墙和代理服务器。
  2. SSE可以使用普通的HTTP服务器,无需额外的服务器软件。
  3. SSE是单向通信,只能由服务器向客户端发送数据,因此可以减少带宽和资源使用。
  4. SSE支持自定义事件和数据格式。

SSE的缺点:

  1. SSE只能使用长轮询或短轮询方式实现,因此无法实现真正的实时通信。
  2. SSE不支持双向通信,因此无法实现客户端向服务器发送数据。
  3. SSE在某些浏览器中可能存在兼容性问题。

Websocket的优点:

  1. Websocket是双向通信的,可以实现真正的实时通信。
  2. Websocket支持服务器向客户端和客户端向服务器发送数据。
  3. Websocket使用单个TCP连接,因此可以减少网络延迟和带宽使用。
  4. Websocket是一种标准化的协议,具有良好的跨平台和跨浏览器支持。

Websocket的缺点:

  1. Websocket需要额外的服务器软件支持,例如Socket.io等。
  2. Websocket的初始连接开销较大,需要经过握手过程。
  3. Websocket在某些防火墙和代理服务器中可能存在问题。

总结

ChatGPT 采用 Server-sent events(SSE)协议,是因为 SSE 提供了一种简单、可靠、高效的服务器推送技术,可以实现实时通信,而且不需要客户端发起请求,可以节省带宽和服务器资源。

SSE 是一种基于 HTTP 协议的服务器推送技术,它允许服务器向客户端发送单向的、实时的、持久的数据流,而客户端只需要通过一个简单的 EventSource 接口进行监听和处理即可。SSE 的优点在于它不需要客户端发起多余的请求,而是通过一个长连接,实现了服务器向客户端的数据推送,避免了频繁的 HTTP 请求,减少了网络延迟和带宽消耗,能够更好地适应实时通信的场景。

因此,ChatGPT 采用 SSE 协议,可以更加高效地推送消息,提高了实时性和用户体验。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
为什么ChatGPT采用SSE协议而不是Websocket?
在探索ChatGPT的使用过程中,我们发现GPT采用了流式数据返回的方式。理论上,这种情况可以通过全双工通信协议实现持久化连接,或者依赖于基于EventStream的事件流。然而,ChatGPT选择了后者,也就是本文即将深入探讨的SSE(Server-Sent Events)技术。
程序新视界
2023/12/30
3.2K0
为什么ChatGPT采用SSE协议而不是Websocket?
springboot单向推送给客户端SseEmitter
SseEmitter 是 Spring Framework 提供的一个类,用于处理服务器向客户端推送事件(Server-Sent Events, SSE)的功能。与 WebSocket 不同,SSE 是单向的,服务器可以推送数据到客户端,但客户端不能推送数据到服务器。SSE 适用于场景包括实时消息通知、进度更新、数据流推送等。Spring Boot 中通过 SseEmitter 实现 SSE 通信简单且高效。
阿超
2024/09/08
2.3K0
09. Springboot集成sse服务端推流
如果项目中有一个场景,假设对接ChatGPT或对接天气类接口的时候,需要服务端主动往客户端进行消息推送或推流。通常的做法有:
有一只柴犬
2024/01/28
10.9K0
09. Springboot集成sse服务端推流
SpringBoot + ResponseBodyEmitter 实时异步流式推送,优雅!
ChatGPT 的火爆,让流式输出技术迅速走进大众视野。在那段时间里,许多热爱钻研技术的小伙伴纷纷开始学习和实践 SSE 异步处理。
程序员皮皮林
2025/03/12
6050
AI大模型文本流如何持续吐到前端,服务端实时通信技术 SSE(Server-Sent Events) 认知
99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式
山河已无恙
2025/02/25
4980
AI大模型文本流如何持续吐到前端,服务端实时通信技术 SSE(Server-Sent Events) 认知
服务器端实时推送技术之SSE
在讲Server-Sent Events (SSE) 之前,我们先来看看 HTTP 请求- 响应。一个标准的 HTTP 请求- 响应,需要客户端打开一个连接,将一个 HTTP 请求(如 HTTP GET 请求)发送到服务端,然后接收到 HTTP 回来的响应,如果该响应被完全发送或者接收,服务端就会把连接关闭。通常是由某个客户发起,客户端才会需要请求所有数据。
kinbug [进阶者]
2020/06/27
3.9K0
服务器端实时推送技术之SSE
干货:DeepSeek+SpringAI实现流式对话!
前面一篇文章我们实现了《炸裂:SpringAI内置DeepSeek啦!》,但是大模型的响应速度通常是很慢的,为了避免用户用户能够耐心等待输出的结果,我们通常会使用流式输出一点点将结果输出给用户。
磊哥
2025/02/14
1.1K0
干货:DeepSeek+SpringAI实现流式对话!
我有 7种 实现web实时消息推送的方案,7种!
做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能。
程序员小富
2022/07/19
11.6K0
我有 7种 实现web实时消息推送的方案,7种!
SSE(Server-Sent Events):替代websocket完成服务器推送
提到服务端数据推送,你可以一下子就想到了Websocket,WebSocket是一种全新的协议,随着HTML5草案的不断完善,越来越多的现代浏览器开始全面支持WebSocket技术了,它将TCP的Socket(套接字)应用在了webpage上,从而使通信双方建立起一个保持在活动状态连接通道。
品茗IT
2020/12/09
4.4K0
SSE(Server-Sent Events):替代websocket完成服务器推送
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。
程序员小富
2024/10/14
4940
WebSocket vs SSE: 实时数据推送到前端的选择与实现(详细)
WebSocket 和 Server-Sent Events (SSE) 都是用于实现实时数据推送的技术,但它们在设计、用途和实现上有一些重要的区别。让我们详细比较这两种技术。
一只牛博
2025/05/31
3370
SSE技术详解:一种全新的HTML5服务器推送事件技术
一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent Events)。关于这4种技术方式的优缺点,请参考《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》。本文将专门讲解SSE技术。
JackJiang
2018/08/23
4.9K0
SSE技术详解:一种全新的HTML5服务器推送事件技术
干货 | 长连接/websocket/SSE等主流服务器推送技术比较
作者简介 本文由携程市场营销研发部武艺嫱和王宇星以及张子祥共同撰写,武艺嫱在市场营销研发部负责前端,王宇星和张子祥在市场营销研发部负责java后端。 最近做的某个项目有个需求,需要实时提醒client端有线上订单消息。所以保持客户端和服务器端的信息同步是关键要素,对此我们了解了可实现的方式。本文将介绍web常用的几种方式,希望给需要服务器端推送消息的同学在选型上有一点启发。 一、推送技术常用的集中实现的实现方式 1.1 短连接轮询: 前端用定时器,每间隔一段时间发送请求来获取数据是否更新,这种方式可兼容i
携程技术
2018/03/16
4.2K0
干货 | 长连接/websocket/SSE等主流服务器推送技术比较
SSE 服务端消息推送
SSE 它是基于 HTTP 协议的,一般意义上的 HTTP 协议是无法做到服务端主动向客户端推送消息的。有一种变通方法,就是服务器向客户端声明,发送的是流信息,本质上,这种通信就是以流信息的方式。
默存
2022/12/03
2.2K0
从ChatGPT聊天服务上深挖Http、WebScoket和SSE推送技术的区别
项目地址:Grt1228/chatgpt-steam-output: Open AI ChatGPT流式输出。Open AI Stream output. ChatGPT Stream output.GPT-3.5 (github.com)
Karos
2023/05/05
2.1K0
从ChatGPT聊天服务上深挖Http、WebScoket和SSE推送技术的区别
每日一博 - Server-Sent Events推送技术
SSE(Server-Sent Events)是一种基于HTTP的服务器推送技术,它允许服务器实时地向客户端推送数据。相比于传统的轮询或长轮询技术,SSE具有更低的延迟、更高的效率和更低的资源消耗。
小小工匠
2023/07/11
1.2K0
每日一博 - Server-Sent Events推送技术
JavaScript 服务器推送技术之 WebSocket
编者按:本文转载自 SHERlocked93 的掘金文章,跟着作者一起来学习一下吧
苏南
2020/12/16
1.7K0
JavaScript 服务器推送技术之 WebSocket
实时技术对比:SSE vs WebSocket vs Long Polling
早期网站仅展示静态内容,而如今我们更期望:实时更新、即时聊天、通知推送和动态仪表盘。
程序猿DD
2025/05/17
1820
实时技术对比:SSE vs WebSocket vs Long Polling
SSE技术详解:使用 HTTP 做服务端数据推送应用的技术
 SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议。
用户7353950
2022/05/10
13.1K0
SSE技术详解:使用 HTTP 做服务端数据推送应用的技术
聊聊SpringAI流式输出的底层实现?
在 Spring AI 中,流式输出(Streaming Output)是一种逐步返回 AI 模型生成结果的技术,允许服务器将响应内容分批次实时传输给客户端,而不是等待全部内容生成完毕后再一次性返回。
磊哥
2025/04/24
3360
聊聊SpringAI流式输出的底层实现?
推荐阅读
相关推荐
为什么ChatGPT采用SSE协议而不是Websocket?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验