为什么ChatGPT选择了SSE,而不是WebSocket?

我在探索ChatGPT的使用过程中,发现了一个有趣的现象:ChatGPT在实现流式返回的时候,选择了SSE(Server-Sent Events),而非WebSocket。

那么问题来了:为什么ChatGPT选择了SSE,而不是WebSocket呢。

SSE是什么?

SSE,全称Server-Sent Events,译为服务器发送事件,它是一种Web技术,允许服务器端实时地向客户端推送信息。SSE运行在HTTP协议之上,它利用持久化的HTTP连接,以事件流(Event Stream)的形式将数据发送给客户端,由客户端监听后获取。服务器端会定期向这个连接发送更新,这些更新被封装在一个或多个HTTP包中,每个包含有更新的事件流。这样,当有新的更新时,服务器就不需要等待客户端的请求,而是直接将数据推送给客户端。当连接被关闭或出现故障时,客户端会自动重新发送请求,重新建立连接。这确保了数据传输的连续性和实时性。

那么,SSE有什么优点呢?

  1. 单向通信:SSE只支持从服务器到客户端的单向通信,服务器可以主动发送数据,用户只能接收。
  2. 高效实时:因使用持久化连接,服务器可以实时地将数据推送给客户端,而无需客户端频繁发起请求。

什么是WebSocket?

WebSocket是一种网络通信协议,它最早被提出来是为了解决HTTP连接的一大限制:HTTP协议中,一个客户端发送给服务端的请求必须由服务端返回一个响应,这使得服务端无法主动向客户端推送数据。WebSocket的通信过程如下:

  1. 客户端通过发送一个特殊的HTTP请求向服务器请求建立WebSocket连接。这个请求类似于:GET /chat HTTP/1.1 Upgrade: websocket Connection: Upgrade
  2. 服务器响应这个请求,确认建立WebSocket连接。这个响应类似于:HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade
  3. 之后,客户端和服务器就可以通过这个常开的连接自由地发送或接收消息。

SSE与WebSocket的比较

你可能疑问,为什么不直接使用WebSocket,它似乎更为通用,也同样支持实时数据推送。这就是我们需要对比两者的理由。

  1. 通信模式:SSE只支持服务器向客户端的单向通信,而WebSocket支持全双工通信,即服务器和客户端可以互相发送数据。对于ChatGPT这样的应用来说,大多数情况下,用户的请求是稀疏的,而服务器的响应是密集的,因此,SSE的单向通信模式更为合适。
  2. 网络协议:SSE运行在HTTP协议上,因此,它可以提供更高的兼容性和灵活性。举个例子,如果你的产品已经部署在Web服务器上,那么你大概率无需做任何改动,就可以使用SSE技术。而WebSocket则需要单独的服务器和端口。

除此之外,SSE和WebSocket在消息大小、连接数量、跨域支持等方面都有一些细微的差别,我们在具体设计时需要根据实际需求和制约因素做出选择。

使用Golang和React实践SSE

首先,我们需要创建一个Golang服务器。这个服务器将监听8000端口,等待客户端的SSE连接请求,并定时向连接发送消息。为了简单起见,这里我们假设服务器每秒产生一条新消息。以下是Golang服务器的代码:

package main
​
import ("fmt""log""net/http""time"
)
​
func main() {http.HandleFunc("/events", func(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "text/event-stream")w.Header().Set("Connection", "keep-alive")w.Header().Set("Cache-Control", "no-cache")w.Header().Set("Access-Control-Allow-Origin", "*")
​for {fmt.Fprintf(w, "data: Message at %s\n\n", time.Now())if flusher, ok := w.(http.Flusher); ok {flusher.Flush()} else {log.Println("Streaming unsupported!")return}time.Sleep(time.Second)}})http.Handle("/", http.FileServer(http.Dir("static")))log.Println("Listening on localhost:8000")http.ListenAndServe("localhost:8000", nil)
}

然后,我们需要创建一个React客户端,这个客户端会建立与Golang服务器的SSE连接,并在收到新消息时更新页面。以下是React客户端的代码:

import React, { useEffect, useState } from 'react';
​
function App() {const [events, setEvents] = useState([]);
​useEffect(() => {const eventSource = new EventSource('http://localhost:8000/events');eventSource.onmessage = (event) => {setEvents((prevState) => [...prevState, event.data]);};}, []);
​return (<div className="App"><h1>Live updates from server</h1>{events.map((event, i) => <p key={i}>{event}</p>)}</div>);
}
export default App;

这个应用程序将从服务器接收一个每秒更新一次的实时数据流,并在客户端将这些更新显示出来。

总结

通过以上的分析和代码示例,我们可以明白为什么ChatGPT会选择使用SSE而非WebSocket。请记住,无论选择哪种实时数据推送技术,必须考虑到你的应用程序的具体需求,例如数据更新的速度、服务器和客户端的能力、网络条件等等。

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/589154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣25题: K 个一组翻转链表

【题目链接】力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff0c;解题代码如下&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode curNode head;ListNode groupHead, groupTail head, lastGrou…

UART通信协议:串行通信的精华

UART通信协议&#xff1a;串行通信的精华 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通信协议是一种广泛应用于串行通信的标准&#xff0c;它在电子设备和嵌入式系统中扮演着至关重要的角色。本文将深入介绍UART通信协议的基本原理、工作方式、…

一个可以用于生产环境得PHP上传函数

上传表单 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文件上传</title> </head> <body><h1>选择要上传的文件</h1><!-- 定义一个包含文件输入字段的表单 --…

[每周一更]-(第46期):Linux下配置Java所需环境及Java架构选型

Linux下配置Java所需环境及Java架构选型 一、配置基础环境 1.配置tomcat 环境变量 wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.8/src/apache-tomcat-10.1.8-src.tar.gz tar -zxvf apache-tomcat-10.1.8-src.tar.gz 在/etc/profile 末尾追加export CATALINA_HOME…

异常控制流ECF

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/xjintong。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 一、异常控制流&#xff08;ECF) 现代系…

[BUG]Datax写入数据到psql报不能序列化特殊字符

1.问题描述 Datax从mongodb写入数据到psql报错如下 org.postgresql.util.PSQLException: ERROR: invalid bytesequence for encoding "UTF8": 0x002.原因分析 此为psql独有的错误&#xff0c;不能对特殊字符’/u0000’,进行序列化&#xff0c;需要将此特殊字符替…

webrtc中的接口代理框架

文章目录 接口代理框架Proxy体系类结构导出接口 webrtc的实际运用PeerConnectionFactoyPeerConnection使用 接口代理框架 webrtc体系庞大&#xff0c;模块化极好&#xff0c;大多数模块都可以独立使用。模块提供接口&#xff0c;外部代码通过接口来使用模块功能。 在webrtc中通…

uni-app 前后端调用实例 基于Springboot

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(1)

前言中曾提到&#xff1a;本章重点介绍PCI桥。 在PCI体系结构中含有两类桥&#xff1a;一类是HOST主桥&#xff1b;另一类是PCI桥。在每一个PCI设备中&#xff08;包括PCI桥&#xff09;&#xff0c;都含有一个配置空间。这个配置空间由HOST主桥管理&#xff0c;而PCI桥可以转…

cfa一级考生复习经验分享系列(十五)

备考背景&#xff1a; 本科211石油理科背景&#xff1b;无金融方面专业知识及工作经验&#xff1b;在职期间备考&#xff1b;有效备考时间2个月&#xff1b;12月一级考试10A。 复习进度及教材选择 首先说明&#xff0c;关于教材的经验分享针对非金融背景考生。 第一阶段&#x…

Java EE Servlet之Cookie 和 Session

文章目录 1. Cookie 和 Session1.1 Cookie1.2 理解会话机制 (Session)1.2.1 核心方法 2. 用户登录2.1 准备工作2.2 登录页面2.3 写一个 Servlet 处理上述登录请求2.4 实现登录后的主页 3. 总结 1. Cookie 和 Session 1.1 Cookie cookie 是 http 请求 header 中的一个属性 浏…

[枚举涂块]画家问题

画家问题 题目描述 有一个正方形的墙&#xff0c;由N*N个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时&#xff0c; 位置(i-1, j)、…

劫持 PE 文件:新建节表并插入指定 DLL 文件

PE格式简介 PE(Portable Executable)格式&#xff0c;是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。PE格式衍生于早期建立在VAX(R)VMS(R)上的COFF(Common Object File Format)文件格式。 Portable 是指对于不同的Windows版本和不同的CPU类型上…

UIToolKit使用心得

起因 因为那个uitoolkit自己写了一套graphView&#xff0c;所以想着来用用但是用完之后发现也不过如此 怎么构建自己的组件 我在继承Node之后想修改node的样式该怎么办呢是这样的。先用pick点击默认的node节点元素- 在pick默认创建的node节点之后&#xff0c;可以把它的uxml…

类的加载顺序问题-demo展示

面试的的时候经常会被问到包含静态代码块、实例代码块和构造器等代码结构的加载顺序问题&#xff0c;下面借用一个面试题&#xff0c;回顾一下类的代码加载顺序。 public class AooTest {public static void main(String[] args) {AooTest.f1();}static AooTest test1 new Ao…

列表的知识点和简单示例

<!DOCTYPE HTML> <html lang"en"><head><meta charset"UTF-8"><title>第一个网页</title></head><body><!--在网页中编写的多个空格默认情况下会自动被iu兰奇解析为一个空格在HTML中有些时候&#xff…

RedisTemplate序列化

SpringBoot整合Redis&#xff0c;配置RedisTemplate序列化。如果使用StringRedisTemplate&#xff0c;那么不需要配置序列化&#xff0c;但是StringRedisTemplate只能存储简单的String类型数据&#xff0c;如图&#xff1a; 如果使用StringRedisTemplate存储一个常规对象&#…

大模型的认知偏见大比拼

大模型的认知偏见大比拼 (adsbygoogle window.adsbygoogle || []).push({}); trackingai.org是一个追踪人工智能网站&#xff0c;监控人工智能聊天机器人中的偏差与偏见。这个网站每天测试18位AI 以今日问题为例&#xff1a; 如今&#xff0c;对性的开放已经太过分了&#…

步进电机为什么叫步进电机,内部结构是什么,工作原理是什么,有什么特点,什么用途。

问题描述&#xff1a;步进电机为什么叫步进电机&#xff0c;内部结构是什么&#xff0c;工作原理是什么&#xff0c;有什么特点&#xff0c;什么用途。 问题解答&#xff1a; "步进"一词表示电机按照固定的步进角度运动。步进电机以控制脉冲信号来驱动转子按照一定的…

3D视觉-相机选用的原则

鉴于不同技术方案都有其适用的场景&#xff0c;立体相机的选型讲究的原则为“先看用途&#xff0c;再看场景&#xff0c;终评精度”&#xff0c;合适的立体相机在方案中可以起到事半功倍的效果。从用途上来进行划分&#xff0c;三维视觉方案主要应用在两个方向&#xff1a;测量…