常见的实时通信技术(轮询、sse、websocket、webhooks)
1. HTTP轮询:最老实的办法
刚开始做实时功能时,我第一个想到的就是轮询。特别简单直白,就像你每隔5分钟就刷新一次朋友圈看看有没有新消息一样。
短轮询:勤快但费劲
短轮询就是客户端隔三差五地问服务器:"有新消息没?"不管有没有,服务器都会立即回答:"没有"或者"有,给你"。
专业一点的说法:
- 客户端定期向服务器发送HTTP请求
- 服务器立即响应,无论是否有新数据
- 客户端处理响应后,等待固定间隔再次请求
// 前端代码示例
setInterval(() => {
fetch('/api/check-updates')
.then(res => res.json())
.then(data => {
// 处理数据
});
}, 5000); // 每5秒问一次
优点:
- 实现简单,是个后端都会写
- 兼容性无敌,连IE6都支持
缺点:
- 太费流量了,就像你每隔5分钟就给朋友发微信"在吗?"
- 延迟感人,如果消息刚好在你两次询问之间来了,就得等下次轮询
长轮询:聪明一点的做法
后来我发现长轮询更聪明些。客户端问完"有新消息吗?",服务器会一直等着,直到真的有消息了才回复。
长轮询是对短轮询的改进:
- 客户端发送请求到服务器
- 服务器保持连接打开,直到有新数据或超时
- 一旦有数据或超时,服务器响应
- 客户端收到响应后立即发起新请求
function longPoll() {
fetch('/api/long-poll')
.then(res => res.json())
.then(data => {
// 处理数据
longPoll(); // 立即发起下一次请求
});
}
体验提升:
- 消息来得更快了,基本实时
- 请求次数少了,省流量
新问题:
- 服务器得一直挂着这些连接,人一多就撑不住了
- 还是得不停地建立新连接
2. SSE:服务器主动找你聊天
后来我发现SSE(Server-Sent Events)这个好东西。它就像你朋友主动给你发微信,不用你老问了。
- 客户端通过EventSource API建立到服务器的连接
- 连接保持打开状态,服务器可随时推送数据
- 数据以特定格式(text/event-stream)传输
- 自动处理连接中断和重连
// 前端
const eventSource = new EventSource('/sse-endpoint');eventSource.onmessage = (e) => {
console.log('收到消息:', e.data);
};
爽点:
- 消息实时推送,延迟超低
- 自动重连,断网也不怕
- 用起来特别简单
不爽的地方:
- 只能服务器推给你,你不能推给服务器(单向)
- 有些老浏览器不支持
- 只能传文本,想传文件没门
适合场景:
- 股票行情推送
- 新闻实时更新
- 像ChatGPT那种一个字一个字往外蹦的效果
3. WebSocket:真正的双向通话
想要真正的实时双向通信?那就得上WebSocket了。这就像微信通话,两边都能随时说话。
- 独立协议(ws://或加密wss://)
- 通过HTTP升级握手建立连接
- 之后保持持久连接双向通信
// 前端
const socket = new WebSocket('wss://example.com/ws');socket.onopen = () => {
socket.send('你好!');
};socket.onmessage = (e) => {
console.log('收到:', e.data);
};
为什么香:
- 真正的实时,延迟极低
- 双向通信,想发就发
- 一个连接管所有,省资源
坑也不少:
- 兼容性还是有点问题(不过现在大部分浏览器都OK了)
- 得自己处理断线重连
- 安全性要特别注意
最适合:
- 在线游戏(比如王者荣耀)
- 实时聊天(微信、QQ这种)
- 协同编辑(像腾讯文档)
4. Webhooks:让服务器主动找你
Webhooks比较特别,它让服务器主动调用你的接口。比如你女朋友说"有事给我打电话",这就是Webhooks。
工作流程:
- 你告诉服务器你的回调地址
- 服务器有事就直接call你
专业一点的说法
- 客户端(实际是接收服务器)提供回调URL
- 服务端在事件发生时向该URL发送HTTP请求
- 接收方处理事件并返回响应
// 你的服务器接口
app.post('/webhook', (req, res) => {
console.log('收到通知:', req.body);
res.status(200).end();
});
好处:
- 实时性很好
- 不用轮询,省事
要注意:
- 你的接口必须随时待命
- 得做好安全验证
- 高并发时可能会挂
常用在:
- 支付结果通知(比如支付宝回调)
- GitHub代码提交触发CI/CD
- 各种第三方服务集成
5、全面对比表
技术指标 | HTTP短轮询 | HTTP长轮询 | SSE (Server-Sent Events) | WebSocket | Webhooks |
---|---|---|---|---|---|
通信方向 | 客户端→服务器 | 客户端→服务器 | 服务器→客户端 | 双向全双工 | 服务器→客户端 |
协议基础 | HTTP | HTTP | HTTP | 独立协议(ws/wss) | HTTP |
连接方式 | 短连接 | 长连接 | 持久连接 | 持久连接 | 反向HTTP调用 |
实时性 | 低(依赖轮询间隔) | 中(减少轮询间隔) | 高 | 极高 | 高 |
数据格式 | 任意 | 任意 | 文本(Event Stream) | 文本/二进制 | 任意 |
实现复杂度 | ★★☆☆☆ | ★★★☆☆ | ★★★★☆ | ★★★★★ | ★★★☆☆ |
兼容性 | 全平台 | 全平台 | 现代浏览器 | 现代浏览器 | 全平台 |
服务器压力 | 高(频繁请求) | 中(保持连接) | 低 | 中(维护连接) | 取决于回调频率 |
客户端压力 | 低 | 低 | 低 | 中(需管理连接) | 需部署服务端 |
流量消耗 | 高(大量请求头) | 中 | 低(复用连接) | 极低 | 低 |
自动重连 | 需手动实现 | 需手动实现 | 内置支持 | 需手动实现 | 需手动实现 |
数据安全性 | 标准HTTPS | 标准HTTPS | 标准HTTPS | WSS加密 | 需额外验证 |
适用场景 | 简单通知,低频更新 | 中等实时性要求 | 实时通知推送 | 高频双向交互 | 服务器触发的外部通知 |
典型应用 | 简单消息提醒 | 基础聊天功能 | 股票行情、新闻推送 | 在线游戏、IM应用 | 支付回调、CI/CD触发 |
实现示例 | 定时AJAX请求 | 挂起HTTP请求 | EventSource API | WebSocket API | 提供回调URL端点 |
6、补充说明
-
渐进增强策略:
- 优先考虑:WebSocket > SSE > 长轮询 > 短轮询
- 回退方案:可考虑功能检测后自动降级
-
混合使用场景:
- WebSocket + Webhooks:用于不同业务场景
- SSE + 短轮询:兼容性方案
-
性能考量:
- 万级连接:WebSocket ≈ SSE > 长轮询 ≫ 短轮询
- 带宽消耗:短轮询 > 长轮询 > Webhooks > SSE > WebSocket
-
移动端特别提示:
- 注意移动网络下的连接稳定性
- 考虑省电模式对长连接的影响
-
安全建议:
- 所有技术都应使用加密版本(wss/https)
- Webhooks必须实现签名验证
- 限制连接频率防止DDoS
相关文章:
常见的实时通信技术(轮询、sse、websocket、webhooks)
1. HTTP轮询:最老实的办法 刚开始做实时功能时,我第一个想到的就是轮询。特别简单直白,就像你每隔5分钟就刷新一次朋友圈看看有没有新消息一样。 短轮询:勤快但费劲 短轮询就是客户端隔三差五地问服务器:"有新…...
2025年第三届盘古石杯初赛(智能冰箱,监控部分)
前言 所以去哪里可以取到自己家里的智能家居数据呢???? IOT物联网取证 1、分析冰箱,请问智能冰箱的品牌? [答案格式:xiaomi] Panasonic2、请问智能冰箱的型号? [答案格式&#x…...
[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程
本人为强化学习小白,为了在后续科研的过程中能够较好的结合强化学习来做相关研究,特意买了西湖大学赵世钰老师撰写的《强化学习数学原理》中文版这本书,并结合赵老师的讲解视频来学习和更深刻的理解强化学习相关概念,知识和算法技…...
基于STM32的INA226电压电流检测仪
系统总体框图 功率检测装置原理图功能及模块连接说明 一、系统功能概述 该装置以STM32F103C8T6微控制器为核心,集成功率检测、数据交互、状态显示和用户提示功能,通过模块化设计实现稳定运行。 二、各模块功能及连接方式 按键模块 功能:…...
Android7 Input(七)App与input系统服务建立连接
概述 本文主要讲述Android 系统创建窗口时与输入管理系统服务通过InputChannel通道建立通信桥梁的过程。 本文涉及的源码路径 frameworks/native/libs/input/InputTransport.cpp frameworks/base/core/java/android/view/InputChannel.java frameworks/base/core/java/andr…...
1.2 C++第一个程序
第一个程序:Hello World 教程 目标 用 cout 输出文字,学会用 endl 换行。理解程序的基本结构,明白 main 函数的作用。 一、程序是什么?——像“魔法食谱” 比喻:写程序就像写一份做蛋糕的食谱! 食材&am…...
Hi3516DV500刷写固件
hi3516DV500刷固件 1、硬件连接 2、软件准备 3、刷固件步骤 一、硬件连接 特别注意的是,串口的接线顺序 通过网线连接好笔记本和开发板后,需要确认一下网口水晶头是否闪烁,以确认网络物理是否连通 二、软件资源准备 固件包准备 打开工具…...
完整卸载 Fabric Manager 的方法
目录 ✅ 完整卸载 Fabric Manager 的方法 1️⃣ 停止并禁用服务 2️⃣ 卸载 Fabric Manager 软件包 3️⃣ 自动清理无用依赖(可选) 4️⃣ 检查是否卸载成功 ✅ 补充(仅清除服务,不删包) ✅ 完整卸载 Fabric Mana…...
linux标准库头文件解析
linuxc标准库 C 标准库(C Standard Library)包含了一组头文件,这些头文件提供了许多函数和宏,用于处理输入输出、字符串操作、数学计算、内存管理等常见编程任务。。 头文件功能简介<stdio.h>标准输入输出库,包含…...
PLC和变频器之间如何接线
这篇文章想梳理一下,不同电平输出的PLC应该如何去接不同品牌的变频器 对于PLC的IO来讲,有高低电平输入的不同,有高低电平输出的区别 对于变频器的DI或DO来讲,不同的品牌内部线路和原理也有区别 我们场地现在用的是西门子1200的…...
【Spring】Spring的请求处理
欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。 目录 引言HTTP/HTTPS协议Spring Web与Spring Web MVCSpring WebFlux 自定义的TPC/IP协议FTP、S…...
现代健康生活养生指南
现代社会中,熬夜加班、久坐不动、饮食不规律成为许多人的生活常态,由此引发的健康问题也日益增多。想要摆脱亚健康,不必依赖中医理念,从以下这些现代科学养生方法入手,就能逐步改善身体状况。 饮食上,注…...
使用tensorRT10部署低光照补偿模型
1.低光照补偿模型的简单介绍 作者介绍一种Zero-Reference Deep Curve Estimation (Zero-DCE)的方法用于在没有参考图像的情况下增强低光照图像的效果。 具体来说,它将低光照图像增强问题转化为通过深度网络进行图像特定曲线估计的任务。训练了一个轻量级的深度网络…...
题单:表达式求值1
题目描述 给定一个只包含 “加法” 和 “乘法” 的算术表达式,请你编程计算表达式的值。 输入格式 输入仅有一行,为需要计算的表达式,表达式中只包含数字、加法运算符 和乘法运算符 *,且没有括号。 所有参与运算的数字不超过…...
【ant design】ant-design-vue 4.0实现主题色切换
官网:Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 我图方便,直接在 app.vue 中加入的 <div class"app-content" v-bind:class"appOption.appContentClass"><a-config-provider…...
MinIO深度解析:从入门到实战——对象存储系统全指南
在当今数字化时代,数据存储至关重要。MinIO作为一款高性能的对象存储系统,正逐渐受到广泛关注。它与云原生存储系统相媲美,并且其API与Amazon S3完全兼容。本文将带您快速了解MinIO,并探讨其在实际中的应用场景。 一、关于MinIO …...
(8)python开发经验
文章目录 1 下载python2 pip安装依赖无法访问3 系统支持4 下载python文档5 设置虚拟环境6 编译安装python 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 下载python 下载地址尽量不要下载最新版…...
uniapp自动构建pages.json的vite插件
对于 uniapp 来说,配置 pages.json 无疑是最繁琐的事情,具有以下缺点: 冗长,页面很多时 pages 内容会很长难找,有时候因为内容很长,导致页面配置比较难找,而且看起来比较凌乱json弊端ÿ…...
【MySQL进阶】如何在ubuntu下安装MySQL数据库
前言 🌟🌟本期讲解关于如何在ubuntu环境下安装mysql的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 dz…...
解放双手的全自动抠图工具
软件介绍 本文要介绍的这款软件是Teorex PhotoScissors,是一款全自动抠图软件。 第二段:软件便捷性 这款来自国外的软件堪称神器,目前已解锁可无限使用。使用起来特别方便,无需安装,打开即可直接操作,并…...
Python多进程编程执行任务
我的需求如下:现有一批任务,使用进程池执行,每个任务执行耗时不一样,任务并发执行期间,需要每隔一段时间监控任务执行进度 直接贴代码: import multiprocessing import time import random from multiproc…...
【Linux笔记】——Linux线程封装
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——Linux线程控制创建、终止与等待|动态库与内核联动 🔖流水不争,争的是…...
ChatGPT + DeepSeek 联合润色的 Prompt 模板指令合集,用来润色SCI论文太香了!
对于非英语母语的作者来说,写SCI论文的时候经常会碰到语法错误、表达不够专业、结构不清晰以及术语使用不准确等问题。传统的润色方式要么成本高、效率低,修改过程又耗时又费力。虽然AI工具可以帮助我们来润色论文,但单独用ChatGPT或DeepSeek都会存在内容泛泛、专业性不足的…...
【typenum】 9 与常量泛型桥接(generic_const_mappings.rs)
一、源码 该代码提供了常量结构体与库类型的转换。 // THIS IS GENERATED CODE //! Module with some const-generics-friendly definitions, to help bridge the gap //! between those and typenum types. //! //! - It requires the const-generics crate feature to be…...
并发学习之synchronized,JVM内存图,线程基础知识
文章目录 Java内存图内存图区域介绍执行流程 进程和线程概念解释线程的6种状态简述等待队列和同步队列(阻塞队列)线程之间是独立的 synchronized静态方法非静态方法代码块 知识总结: 方法区存储类信息正在执行的程序叫进程,进程会…...
使用Docker部署Nacos
sudo systemctl start docker sudo systemctl enable docker docker --version 步骤 2: 拉取 Nacos Docker 镜像 拉取 Nacos 镜像: 你可以从 Docker Hub 上拉取官方的 Nacos 镜像,使用以下命令: docker pull nacos/nacos-server 这会从 …...
如何 naive UI n-data-table 改变行移动光标背景色
默认是light 灰,想换个显眼包色,折腾半天,可以了。 无废话上代码: <template><n-data-tablesize"small":columns"columns":data"sortedDataList":bordered"true":row-key"…...
Maven 插件扩展点与自定义生命周期
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
Redis的发布订阅模型是什么,有哪些缺点?
Redis 发布订阅模型概述 Redis 发布订阅(Pub/Sub)是一种消息广播模式,核心角色包括: 发布者(Publisher):向指定频道(Channel)发送消息。频道(Channel&#…...
【EDA软件】【联合Modelsim仿真使用方法】
背景 业界EDA工具仿真功能是必备的,例如Vivado自带仿真工具,且无需联合外部仿真工具,例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim,才能实现仿真功能。 方法一:FUXI联合ModelSim 1 添加testbench文件 新建to…...
C语言_动态内存管理
1. 为什么存在动态内存分配 ? 当前,我们掌握的内存开辟方式有: int val22;// 在栈空间上开辟四个字节 char arr[10]{0};// 在栈空间上开辟10个字节的连续空间而上述的开辟空间的方式有两个特点: 空间开辟大小示固定的数组在申明的时候&am…...
使用Langfuse和RAGAS,搭建高可靠RAG应用
大家好,在人工智能领域,RAG系统融合了检索方法与生成式AI模型,相比纯大语言模型,提升了准确性、减少幻觉且更具可审计性。不过,在实际应用中,当建好RAG系统投入使用时,如何判断接收信息是否正确…...
MySQL 数据库优化:ShardingSphere 原理及实践
在高并发、大数据量的业务场景下,MySQL 作为关系型数据库的核心存储引擎,其性能和扩展性面临严峻挑战。ShardingSphere 作为 Apache 顶级开源项目,提供了分布式数据库解决方案,通过分库分表、读写分离、弹性迁移等能力,帮助开发者实现 MySQL 的水平扩展与性能优化。 本文…...
【Redis】零碎知识点(易忘 / 易错)总结回顾
一、Redis 是一种基于键值对(key-value)的 NoSQL 数据库 二、Redis 会将所有数据都存放在内存中,所以它的读写性能非常惊人 Redis 还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障时…...
谷歌浏览器(Google Chrome)136.0.7103.93便携增强版|Win中文|安装教程
软件下载 【名称】:谷歌浏览器(Google Chrome)136.0.7103.93 【大小】:170M 【语言】:简体中文 【安装环境】:Win10/Win11 【夸克网盘下载链接】(务必手机注册): h…...
【滑动窗口】LeetCode 209题解 | 长度最小的子数组
长度最小的子数组 前言:滑动窗口一、题目链接二、题目三、算法原理解法一:暴力枚举解法二:利用单调性,用滑动窗口解决问题那么怎么用滑动窗口解决问题?分析滑动窗口的时间复杂度 四、编写代码 前言:滑动窗口…...
WebXR教学 07 项目5 贪吃蛇小游戏
WebXR教学 07 项目5 贪吃蛇小游戏 index.html <!DOCTYPE html> <html> <head><title>3D贪吃蛇小游戏</title><style>body { margin: 0; }canvas { display: block; }#score {position: absolute;top: 20px;left: 20px;color: white;font-…...
2.1.3
# Load the data file_path finance数据集.csv data pd.__________(file_path) --- data pd.read_csv(file_path) # 识别数值列用于箱线图 numeric_cols data.select_dtypes(include[float64, int64]).__________ --- numeric_cols data.select_dtypes(include[flo…...
StreamCap v0.0.1 直播录制工具 支持批量录制和直播监控
—————【下 载 地 址】——————— 【本章下载一】:https://drive.uc.cn/s/2fa520a8880d4 【本章下载二】:https://pan.xunlei.com/s/VOQDt_3v0DYPxrql5y2zxgO1A1?pwd2kqi# 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...
小蜗牛拨号助手用户使用手册
一、软件简介 小蜗牛拨号助手是一款便捷实用的拨号辅助工具,能自动识别剪贴板中的电话号码,支持快速拨号操作。最小化或关闭窗口后,程序将在系统后台运行,还可设置开机自启,方便随时使用,提升拨号效率。 …...
哈夫曼树(Huffman Tree)
1. 基本概念 哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度(WPL, Weighted Path Length)最短的二叉树。它主要用于数据压缩和编码优化,通过为不同权值的节点分配不同长度的…...
布隆过滤器和布谷鸟过滤器
原文链接:布隆过滤器和布谷鸟过滤器 布隆过滤器 介绍 布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数,检查值是“可能在集合中”还是“绝对不在集合中” 空间效率高&a…...
Vue+Vite学习笔记
Cesium与Vue集成:详解Cesium-Vue项目搭建与运行步骤指南 - 云原生实践 为什么按照这篇↑完成三步会有能打开的网址,不止localhost8080还有用127.0.0.1那个表示的。 用这个构建,出来的是localhost:5173?...
UE 材质基础 第一天
课程:虚幻引擎【UE5】材质宝典【初学者材质基础入门系列】-北冥没有鱼啊_-稍后再看-哔哩哔哩视频 随便记录一些 黑色是0到负无穷,白色是1到无穷 各向异性 有点类似于高光,可以配合切线来使用,R G B 相当于 X Y Z轴,切…...
网络编程中的直接内存与零拷贝
本篇文章会介绍 JDK 与 Linux 网络编程中的直接内存与零拷贝的相关知识,最后还会介绍一下 Linux 系统与 JDK 对网络通信的实现。 1、直接内存 所有的网络通信和应用程序中(任何语言),每个 TCP Socket 的内核中都有一个发送缓冲区…...
语音转文字
语音转文字工具大全 1. 网易 网易见外(网页) 地址:网易见外 - AI智能语音转写听翻平台 特点:完全免费,支持音频转文字,每日上限2小时 有道云笔记(安卓/iOS) 地址&a…...
软件设计师考试《综合知识》创建型设计模式考点分析
软件设计师考试《综合知识》创建型设计模式考点分析 1. 分值占比与考察趋势(75分制) 模式名称近5年题量分值占比高频考察点最新趋势抽象工厂模式45.33%产品族创建/跨平台应用结合微服务配置考查(2023)工厂方法模式56.67%单一产品扩展/日志系统与IoC容器…...
【八股战神篇】Java集合高频面试题
专栏简介 八股战神篇专栏是基于各平台共上千篇面经,上万道面试题,进行综合排序提炼出排序前百的高频面试题,并对这些高频八股进行关联分析,将每个高频面试题可能进行延伸的题目再次进行排序选出高频延伸八股题。面试官都是以点破…...
STM32F103定时器1每毫秒中断一次
定时器溢出中断,在程序设计中经常用到。在使用TIM1和TIM8溢出中断时,需要注意“TIM_TimeBaseStructure.TIM_RepetitionCounter0;”,它表示溢出一次,并可以设置中断标志位。 TIM1_Interrupt_Initializtion(1000,72); //当arr1…...
BC 范式与 4NF
接下来我们详细解释 BC 范式(Boyce-Codd范式,简称 BCNF),并通过具体例子说明其定义和应用。 一、BC范式的定义 BC范式(Boyce-Codd范式,BCNF)是数据库规范化理论中的一种范式,它比第…...