news 2026/3/23 19:01:03

一站式了解长轮询,SSE和WebSocket

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一站式了解长轮询,SSE和WebSocket

文章目录

  • 引言
  • 1.Long Polling (长轮询)
  • 2. SSE (Server-Sent Events)
  • 3. WebSocket
  • 对比总结

引言

作为后端开发人员(Java/Go),你肯定遇到过需要实时将服务器数据推送到客户端的场景。传统的 HTTP 请求-响应模式无法满足这种需求。

为了解决这个问题,演变出了三种主流方案:Long Polling (长轮询)SSE (Server-Sent Events)WebSocket

以下是这三者的深度对比与技术解析。

1.Long Polling (长轮询)

这里通过一个日常场景来引入长轮询的知识介绍,我们日常生活工作和学习都会用手机扫码登录或者授权,你有没有细心发现这样的现象?即如果你长时间不去扫码进行授权,过了一段时间这个二维码就会失效,需要重新刷新才能重新授权。这其实就是长轮询的应用😯

长轮询是对传统短轮询(Short Polling)的一种优化。它本质上仍然是 HTTP 请求,但通过“挂起”请求来模拟实时性。

  • 工作原理:

    1. 客户端发起 HTTP 请求(例如GET /poll)。
    2. 关键点:服务器收到请求后,如果没有新数据,不立即返回,而是将请求挂起(Hold 住连接),直到有新数据产生或达到超时时间(如 30秒)。
    3. 一旦有数据或超时,服务器返回响应。
    4. 客户端收到响应后,处理数据,并立即再次发起新的请求,周而复始。
  • 优点:

    • 兼容性极高:基于标准 HTTP,几乎所有浏览器和服务器都支持,无需特殊协议升级。
    • 容错性:因为每次都是新请求,网络抖动后的重连机制就是天然的(发起下一个请求即可)。
  • 缺点:

    • 开销大:虽然比短轮询好,但每次重新连接都要重新发送 HTTP Header(鉴权信息等),对于频繁的小数据推送,带宽浪费严重。
    • 有延迟:数据推送到下一次请求建立之间存在微小的时间差。
    • 服务器资源占用:服务器需要维护大量挂起的线程(Java 早期 BIO 时代这是噩梦,NIO/Go 协程缓解了这个问题)。
  • 适用场景:扫码登录确认、低频的通知推送、老旧系统改造

2. SSE (Server-Sent Events)

SSE 是一种基于 HTTP 的轻量级单向通信机制。

  • 工作原理:

    1. 客户端发起请求,Header 中声明Accept: text/event-stream
    2. 服务器响应Content-Type: text/event-stream,并保持连接不断开
    3. 服务器通过这个连接不断地写入数据流(Stream),格式通常是data: <content>\n\n
    4. 关键点:这是单向的,只能服务器发给客户端。客户端如果想发数据给服务器,需要另外发起一个标准的 HTTP 请求。
  • 优点:

    • 轻量级:使用简单,基于 HTTP 协议,对防火墙和负载均衡器友好。
    • 断线自动重连:浏览器原生支持 SSE,断网后会自动尝试重连。
    • 开发简单:Go (gin框架) 和 Java (Spring WebFlux) 处理 SSE 都非常容易。
  • 缺点:

    • 单向通信:只适合“读”场景。
    • 文本传输:默认传输文本,传输二进制数据需要 Base64 编码,效率较低。
    • 连接数限制:HTTP/1.1 下浏览器对同一域名的并发连接数有限制(通常 6 个),如果打开多个 Tab 页可能会阻塞。HTTP/2 可以解决这个问题。
  • 适用场景:ChatGPT 的打字机效果、股票行情更新、体育比分直播、服务器日志监控、MCP tool开发等

3. WebSocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

  • 工作原理:

    1. 握手:客户端发起 HTTP 请求,Header 包含Upgrade: websocketConnection: Upgrade
    2. 升级:服务器同意升级,返回101 Switching Protocols
    3. 传输:连接建立后,HTTP 协议的概念消失,双方通过 TCP 通道直接传输二进制或文本帧(Frame)。双方可以随时互相发送数据。
  • 优点:

    • 全双工:真正的双向实时通信。
    • 高性能:建立连接后,数据传输只有极小的帧头开销(不像 HTTP 每次都要带 Header)。
    • 低延迟:无需轮询,数据即时到达。
  • 缺点:

    • 复杂性:需要处理心跳检测、断线重连、粘包拆包(框架通常已封装)等状态管理。
    • 负载均衡麻烦:因为是长连接,状态存储在内存中。在集群环境下,通常需要 Nginx 配置 IP Hash 或者使用 Redis Pub/Sub 来同步集群消息。
    • 防火墙/代理限制:部分企业内网防火墙可能会拦截非 HTTP 流量或长时间不断的连接。
  • 适用场景:在线多人游戏、即时聊天室 (IM)、协同编辑文档、极高频的实时交易平台。

对比总结

特性Long Polling (长轮询)SSE (Server-Sent Events)WebSocket
通信方向双向 (伪)单向(Server -> Client)全双工
协议HTTPHTTPTCP (经 HTTP 握手)
数据格式任意文本 (UTF-8)二进制 / 文本
开销高 (Header重复发送)低 (长连接)极低(轻量帧头)
实现难度中等简单复杂
浏览器限制HTTP/1.1 限制 6 个连接无明显限制

这三个知识点是后台面试经常问到的,如果你的简历经历是带有高性能网络通信服务器等背景的(IM)等等,那则是必须要会回答的❤️

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 0:47:00

vue基于Spring Boot框架的在线投稿系统的设计与开发_fu09r447

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/3/16 10:39:49

教程8:结构体的添加和使用-–-behaviac

原文 本文档描述的是3.6及以后版本&#xff0c;对于3.5及以前的老版本请参考分类“3.5”。对于结构体类型的使用&#xff0c;包括新增全新的结构体和扩展使用已有的结构体。对于新增的结构体&#xff0c;又包括编辑器是否自动生成该结构体的代码。 实际上&#xff0c;我们将新…

作者头像 李华
网站建设 2026/3/16 11:55:38

JavaScript闭包终极指南:从原理到实战(2025版)

JavaScript闭包终极指南&#xff1a;从原理到实战&#xff08;2025版&#xff09;闭包是JavaScript的核心特性&#xff0c;也是面试高频考点与开发易错点。很多开发者只停留在“函数嵌套函数”的表层认知&#xff0c;却不懂其底层原理与实战价值。本文从“内存模型→语法定义→…

作者头像 李华
网站建设 2026/3/13 0:12:45

LangChain 1.0智能体核心组件全解析:从架构到实战

在人工智能飞速发展的今天&#xff0c;单纯的语言模型已经无法满足复杂任务的需求。就像一个聪明的大脑如果没有手脚&#xff0c;也难以完成实际工作。LangChain 1.0的智能体&#xff08;Agent&#xff09;正是为了解决这一问题&#xff0c;将语言模型与工具、中间件、记忆等组…

作者头像 李华