Socket.IO介绍
Socket.IO 是一个用于实现客户端与服务器之间“低延迟、双向、基于事件通信”的开源库。可以把它简单理解为Socket.IO WebSocket 通信能力 心跳检测 自动重连 事件系统 房间广播 断线处理等工程化能力。它特别适合聊天室、在线会议状态、实时通知、协同编辑、在线客服、设备状态监控等需要服务器主动向浏览器推送数据的场景。Socket.IO 与 WebSocket 的关系Socket.IO 经常使用 WebSocket 传输数据但它并不等于 WebSocket。对比项原生 WebSocketSocket.IO定位浏览器原生通信协议/API基于事件的实时通信库消息形式字符串或二进制数据自定义事件与参数心跳检测需要自己实现内置自动重连需要自己实现内置重连退避需要自己实现内置指数退避HTTP 长轮询降级不支持支持消息确认 ACK需要自己设计内置房间与广播需要自己实现内置多路复用需要自己实现支持 Namespace协议兼容标准 WebSocketSocket.IO 自有协议特别需要注意原生 WebSocket 客户端不能直接连接 Socket.IO 服务器。Socket.IO 客户端也不能直接连接普通 WebSocket 服务器。因为 Socket.IO 会在底层数据上增加自己的协议元数据。官方文档说明例如// 这通常无法连接普通 WebSocket 服务constsocketio(wss://example.com/websocket);只有服务端也是 Socket.IO 协议时才能正常连接。它是怎么工作的Socket.IO 可以分为两层应用业务代码Socket.IO事件、房间、ACK、广播Engine.IO握手、心跳、断线检测WebSocketHTTP 长轮询一般连接过程是客户端首先与服务器握手。获取会话 ID、心跳间隔和超时时间。默认情况下可能先通过 HTTP 长轮询建立连接。检测环境支持后尝试升级为 WebSocket。连接期间通过 Ping/Pong 检测连接是否仍然有效。连接断开后客户端自动尝试重新连接。握手数据大致如下{sid:FSDjX-WRwSA4zTZMALqx,upgrades:[websocket],pingInterval:25000,pingTimeout:20000}其中sid当前连接的会话 IDupgrades可以升级到的传输方式pingInterval服务器发送 Ping 的时间间隔pingTimeout等待 Pong 的超时时间这是 Socket.IO 降低 WebSocket“假连接”问题的重要机制。运作原理核心功能1. 基于事件通信使用原生 WebSocket 时通常需要自己约定消息格式websocket.send(JSON.stringify({type:meeting-status,data:{status:started}}));Socket.IO 可以直接发送事件socket.emit(meeting-status,{status:started});接收事件socket.on(meeting-status,(data){console.log(data.status);});这样业务代码更加直观不需要自己根据type分发消息。2. 自动重连如果网络切换、服务器重启、代理超时或浏览器暂时卡顿导致连接断开Socket.IO 客户端会自动重连并采用退避策略避免大量客户端同时冲击服务器。constsocketio(https://example.com,{reconnection:true,reconnectionAttempts:10,reconnectionDelay:1000,reconnectionDelayMax:5000});但自动重连只负责“重新建立连接”不意味着断线期间的业务数据一定能够恢复。3. 心跳检测Socket.IO 内置 Ping/Pong 心跳机制。如果服务器没有按时收到客户端的 Pong或者客户端长期没有收到服务器的 Ping连接就会被判断为断开从而避免连接实际上已经失效但前端仍显示“已连接”的情况。不过如果浏览器 JS 主线程长时间卡住、电脑休眠或后台页面被严重节流心跳也可能无法及时处理从而触发断线。4. ACK 消息确认发送方可以要求接收方返回确认结果socket.timeout(5000).emit(upload-audio,{meetingId:123,chunkId:chunk-001},(error,response){if(error){console.log(5 秒内没有收到确认);return;}console.log(服务器已确认,response);});服务端socket.on(upload-audio,async(data,callback){awaitsaveAudio(data);callback({success:true});});ACK 很适合你之前提到的音频 PCM 数据发送场景前端发送初始化请求。等待服务器 ACK。ACK 前产生的 PCM 数据进入 FIFO。收到 ACK 后按顺序发送。每个关键数据包可以继续使用 ACK 或序列号确认。5. 房间 Room可以把不同客户端加入不同房间io.on(connection,(socket){socket.on(join-meeting,(meetingId){socket.join(meeting:${meetingId});});});只向特定会议里的用户广播io.to(meeting:123).emit(transcription,{text:这是实时转写内容});常见用途包括一个会议对应一个房间一个项目对应一个房间一个用户对应一个私人房间一个部门对应一个通知房间6. Namespace 命名空间Namespace 可以在同一条底层连接上划分多个逻辑通道constmeetingSocketio(/meeting);constnotificationSocketio(/notification);constadminSocketio(/admin);适合将会议、通知和后台管理等业务模块隔离。7. 断线状态恢复Socket.IO 支持连接状态恢复可以在短暂断线后尝试恢复Socket ID加入的房间Socket 上保存的数据断线期间错过的部分数据包服务端需要开启constionewServer(httpServer,{connectionStateRecovery:{maxDisconnectionDuration:2*60*1000,skipMiddlewares:true}});客户端重新连接后可以判断socket.on(connect,(){if(socket.recovered){console.log(连接状态恢复成功);}else{console.log(需要重新同步完整状态);}});恢复并不保证每次都成功因此业务仍然需要准备“重新拉取完整状态”的方案。连接状态恢复一个最小使用示例安装服务端npminstallsocket.io安装客户端npminstallsocket.io-clientNode.js 服务端import{createServer}fromnode:http;import{Server}fromsocket.io;consthttpServercreateServer();constionewServer(httpServer,{cors:{origin:http://localhost:5173}});io.on(connection,(socket){console.log(客户端连接,socket.id);socket.on(message,(message,callback){console.log(收到消息,message);io.emit(message,message);callback?.({success:true});});socket.on(disconnect,(reason){console.log(连接断开,reason);});});httpServer.listen(3000);前端import{io}fromsocket.io-client;constsocketio(http://localhost:3000);socket.on(connect,(){console.log(连接成功,socket.id);socket.emit(message,{text:你好},(response){console.log(服务器确认,response);});});socket.on(message,(message){console.log(收到消息,message);});socket.on(disconnect,(reason){console.log(连接断开,reason);});socket.on(connect_error,(error){console.log(连接失败,error.message);});需要特别注意的消息可靠性Socket.IO 能保证已经到达的消息顺序但默认消息送达语义是“最多一次”。也就是说消息发送过程中突然断线不能确定服务端是否收到。客户端重新连接后这条正在发送的消息不会自动重试。客户端离线期间服务端发出的消息默认不会自动补发。ACK 超时重试可能导致服务器收到重复消息。因此关键业务还应加入唯一消息 ID 序列号 ACK 超时重试 服务端幂等处理 数据持久化 重连后的缺失数据补偿例如音频分片、会议状态变更、支付或重要指令都不能只依赖 Socket.IO 的自动重连。消息可达性保证优点和缺点优点对 WebSocket 进行了完整的工程化封装自动处理心跳、断线和重连事件式 API 容易开发Room、Namespace 和广播能力完善支持 Node.js、浏览器、React Native以及多种第三方语言客户端非常适合中小型实时应用快速开发缺点不是标准 WebSocket 协议前后端必须使用兼容的 Socket.IO 实现比原生 WebSocket 多一层协议和少量消息开销自动重连不等于业务数据绝对可靠多服务器部署需要配置 Adapter、负载均衡等如果只需要极简、高吞吐的二进制数据流原生 WebSocket 可能更合适不适合作为移动应用长期后台推送方案后台通知更适合 APNs、FCM 等系统

相关新闻

掌握Magisk:从Android Root入门到高级系统定制实战

掌握Magisk:从Android Root入门到高级系统定制实战

掌握Magisk:从Android Root入门到高级系统定制实战 【免费下载链接】Magisk The Magic Mask for Android 项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk Magisk作为Android系统上最强大的Root解决方案,为技术爱好者和开发者提供了无限…

2026/7/30 10:33:43阅读更多 →
洛谷练习P5719,P1047

洛谷练习P5719,P1047

一.P5719 1.创建输入对象,读取数据 Scanner scannew Scanner(System.in) int nscan.nextInt() int kscan.nextInt() 2.创建个数与总和的初始值 int s10; int s20; double c10; double c20;(使用double可以保留小数) 3.遍历数组n,寻…

2026/7/30 10:33:43阅读更多 →
文件上传接口,同时传递一个对象做参数

文件上传接口,同时传递一个对象做参数

文件上传接口,同时传递一个对象做参数。 1. 代码 如此可以避免在url ?后面拼接参数。Operation(summary "电厂煤炭结算单:导入")PostMapping("/importData")public ApiResult importData(ModelAttribute SaleQuery quer…

2026/7/30 10:31:43阅读更多 →
鸣潮自动化终极指南:零门槛解放双手的智能助手完整教程

鸣潮自动化终极指南:零门槛解放双手的智能助手完整教程

鸣潮自动化终极指南:零门槛解放双手的智能助手完整教程 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 鸣潮自动化工具…

2026/7/30 11:44:00阅读更多 →
NanaZip完全指南:Windows上最强大的免费文件压缩工具

NanaZip完全指南:Windows上最强大的免费文件压缩工具

NanaZip完全指南:Windows上最强大的免费文件压缩工具 【免费下载链接】NanaZip The 7-Zip derivative intended for the modern Windows experience 项目地址: https://gitcode.com/gh_mirrors/na/NanaZip NanaZip是一款专为现代Windows体验设计的开源文件压…

2026/7/30 11:44:00阅读更多 →
切问学术:专注学术领域深耕 助力科研学习与学术能力提升的专业平台

切问学术:专注学术领域深耕 助力科研学习与学术能力提升的专业平台

研一新生必装 五个让你少走三年弯路的科研神器 刚进实验室的研一新生最容易陷入迷茫。不知道怎么确定研究方向,看不懂海量外文文献,不会设计合理的实验方案,数据处理和绘图一窍不通,写第一篇学术论文更是无从下手。别慌&#xff…

2026/7/30 11:44:00阅读更多 →
全网资源下载神器:3分钟学会res-downloader的终极使用技巧

全网资源下载神器:3分钟学会res-downloader的终极使用技巧

全网资源下载神器:3分钟学会res-downloader的终极使用技巧 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否…

2026/7/30 11:44:00阅读更多 →
2027届毕业生就业前景分析与在校期间职业发展规划建议指南

2027届毕业生就业前景分析与在校期间职业发展规划建议指南

研一新生必装 五个让你少走三年弯路的科研神器 刚进实验室的研一新生最容易陷入迷茫。不知道怎么确定研究方向,看不懂海量外文文献,不会设计合理的实验方案,数据处理和绘图一窍不通,写第一篇学术论文更是无从下手。别慌&#xff…

2026/7/30 11:44:00阅读更多 →
FTP协议模式选择与网络适配实战指南

FTP协议模式选择与网络适配实战指南

1. FTP协议基础与模式选择逻辑FTP(File Transfer Protocol)作为最古老的文件传输协议之一,自1971年诞生以来经历了多次迭代更新。其核心特征在于使用双通道通信机制:控制连接(默认21端口)负责传输指令&…

2026/7/30 11:42:00阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →