当前位置: 首页 > news >正文

WebSocket没心跳,连接老断!

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

WebSocket断连?心跳包没发对,我差点把服务器干爆!

目录

  • WebSocket断连?心跳包没发对,我差点把服务器干爆!
    • 报错现场:连接像过山车,5分钟一断
    • 核心根源:服务器在等心跳,你却在发呆
    • 解决代码:30秒发个心跳包,稳如老狗
    • 避坑总结:这些坑我全踩过

报错现场:连接像过山车,5分钟一断

昨天上线的实时聊天功能,用户疯狂投诉“连不上”。控制台疯狂刷:

WebSocket connection to 'wss://xxx' failed: Error in connection establishment: net::ERR_CONNECTION_RESET

断连时间点精准得像闹钟——每5分钟整。我盯着日志,头发都薅秃了:服务器明明开着,为啥连不上?

核心根源:服务器在等心跳,你却在发呆

别被“WebSocket”名字骗了。服务器(比如Nginx)默认超时15分钟。没心跳包?服务器直接把你踢下线
我查了Nginx配置:proxy_read_timeout 15m。客户端没发心跳,服务器一拍大腿:这玩意儿没响应,关了!
(真想骂一句:文档写“支持长连接”,结果连心跳都不给个例子!)

解决代码:30秒发个心跳包,稳如老狗

问题代码(坑爹版):

constws=newWebSocket('wss://api.xxx.com');ws.onopen=()=>console.log('连接成功');// 只管连,不管活

修复代码(真香版):

constws=newWebSocket('wss://api.xxx.com');letheartbeatTimer;// 心跳计时器// 连接成功启动心跳ws.onopen=()=>{console.log('连接稳了,开始发心跳');// 每30秒发一次心跳包(别用15秒,服务器可能扛不住)heartbeatTimer=setInterval(()=>{// 确保连接是OPEN状态再发if(ws.readyState===WebSocket.OPEN){ws.send('ping');// 发个空字符串就行,服务器会回pong}else{clearInterval(heartbeatTimer);// 连接断了,赶紧停}},30000);// 30秒一次};// 连接关闭时清理心跳ws.onclose=()=>{clearInterval(heartbeatTimer);// 防止内存泄漏console.log('连接断了,心跳也停了');};

避坑总结:这些坑我全踩过

  1. 别用setInterval发心跳
    服务器可能在处理心跳,你发太快反而拖垮它。30秒是安全值(Nginx默认超时15分钟,留够缓冲)。

  2. 必须判断readyState
    连接断了还在发心跳?内存泄漏警告!修复代码里if (ws.readyState === OPEN)这句是保命符。

  3. 服务器要支持pong
    如果服务器不回pong,心跳就白发了。检查后端:ws.onmessage = e => e.data === 'ping' && ws.send('pong')

  4. 别信“自动心跳”
    有些库(比如Socket.IO)默认有心跳,但原生WebSocket没有。别以为用new WebSocket()就完事了。

最后补一句:心跳包不是发“心跳”字眼,发个空字符串就行。我昨天还被坑在ws.send('heartbeat')上,服务器根本不认——这破文档,写得比我的代码还乱。
现在,用户说“连接稳如老狗”,我终于能睡个整觉了。

http://www.jsqmd.com/news/1147366/

相关文章:

  • 膜片弹簧离合器结构解析:5大部件功能详解与3类车型适配方案
  • 工业级IMU运动追踪系统设计与传感器融合实践
  • GitHub中文化插件:让GitHub界面说中文的智能解决方案
  • 低成本外呼机器人和人工电销哪个划算?真实成本对比
  • AD5593R与PIC18F87J11混合信号系统设计实践
  • 2026重庆 5310 无缝钢管供应 行业供货模式经验分享
  • 番茄小说下载器:解锁数字阅读新体验的开源神器
  • ICM-42605与PIC18F87J50实现6DOF运动追踪系统设计
  • 孩子怕看牙?皓贝一口腔医院的儿童诊疗策略
  • OpenClaw入门:Windows本地服务编排与Webhook胶水实践
  • STM32F407ZG与WSEN-ISDS传感器的高精度运动跟踪方案
  • 带传动设计实战:V带与同步带选型对比,5步完成传动系统设计
  • Windows防休眠终极指南:NoSleep让你的电脑永不“打盹“
  • 鸿蒙数理体系视域下:全域耦合雨洪一体化演化模型,前置预判应对极端天气
  • 锂离子电池主动均衡技术解析与BQ25887应用
  • 番茄小说下载器:三步轻松获取离线电子书
  • 计算机毕业设计之基于Web的师生在线交流学习系统的设计与实现
  • 工业负载控制方案:TPD2017FN与PIC32MZ实战解析
  • STM32上拉下拉电阻原理与GPIO配置实战
  • 利用Turbo Intruder挖掘高并发竞争条件漏洞的实战指南
  • 高性能虚拟显示器驱动深度解析:Parsec VDD架构设计与实战指南
  • BQ25887与PIC18F46K80实现高效电池管理系统设计
  • 基于TC78H651AFNG和STM32的直流有刷电机驱动方案
  • 光遇PC版安装闪退/卡顿/黑屏?这份技术排查手册一次解决
  • 美国富人放弃传统学校,一年花52万把孩子送进AI私塾
  • TB67H480FNG与PIC18F46K22电机控制黄金组合解析
  • 腾讯开源 Hy3 采用 Apache 协议:参数量仅为 GLM-5.2 一半,综合性能全线占优,仅代码领域落败
  • DeMaVLA:面向可变形物体折叠的具身视觉语言动作模型
  • 两融集中度:杠杆投资中的“避险护城河”
  • BMI160与STM32F042C6运动追踪开发实战