javascript如何使用WebSocket_如何实现实时通信【教程】
发布时间 - 2026-01-23 00:00:00 点击率:次WebSocket连接失败主因是服务端未启动、协议不匹配或浏览器拦截;需核对ws/wss协议、检查Network中101状态码、确保后端正确响应升级请求,并避免file://协议下使用。
WebSocket 连接失败的常见原因和检查点
直接 new WebSocket() 报错或连接立刻关闭,大概率不是代码写错了,而是服务端没起来、URL 协议不匹配,或者浏览器被拦截。先确认 ws:// 或 wss:// 和后端实际暴露的协议一致;本地开发时如果后端用 http://localhost:3000,前端却连 ws://127.0.0.1:8080,跨域+协议+端口全错,必然失败。
- 检查浏览器控制台 Network 标签页里 WebSocket 请求的状态码:
101 Switching Protocols才算成功握手,否则看 Response Headers 有没有Sec-WebSocket-Accept - 确保后端已正确响应 WebSocket 升级请求(比如 Node.js 的
ws库需显式server.handle)
Upgrade()
- Chrome 浏览器在非
http://或https://页面(如file://)下会静默拒绝ws://连接,必须走本地服务器
onmessage 回调里如何安全解析 JSON 数据
WebSocket.onmessage 接收到的 event.data 是 string 或 Blob,不是自动 JSON 解析后的对象。直接 JSON.parse(event.data) 可能抛错,尤其当服务端发来非 JSON 字符串(比如心跳 ping/pong、二进制帧、调试日志)时。
- 始终用
try...catch包裹JSON.parse(),避免整个回调崩溃 - 提前判断
typeof event.data === 'string',跳过Blob或ArrayBuffer类型(除非你明确要处理二进制) - 服务端最好统一加个
type字段,比如{ "type": "message", "payload": {...} },前端按 type 分发逻辑,而不是硬解析所有 data
如何避免重复连接和自动重连失控
页面刷新、网络抖动、服务端重启都会导致连接断开。但 onclose 里直接 new WebSocket() 会引发无限重连风暴,尤其配合未加延迟的递归调用。
- 用布尔标志位(如
let isConnecting = false)防止onclose多次触发新建实例 - 重连前加指数退避:第一次等 1s,第二次 2s,第三次 4s……上限建议 30s,避免压垮服务端
- 限制最大重连次数(比如 5 次),之后应提示用户“连接异常”,并提供手动重试按钮(
reconnectBtn.addEventListener('click', initWS)) - 在
onopen中清除之前的重连定时器,避免旧定时器在新连接建立后仍执行
发送消息前必须检查 readyState
WebSocket.readyState 不是永远等于 WebSocket.OPEN。页面刚加载时是 0(CONNECTING),断连瞬间变成 0 或 3(CLOSED),此时调用 send() 会直接报错 InvalidStateError,且不会进入 onerror。
- 每次
send()前必须判断:if (ws.readyState === WebSocket.OPEN) { ws.send(...) } - 如果处于
CONNECTING(0)状态,可把消息暂存到队列(pendingMessages.push(msg)),并在onopen中批量发送 - 不要依赖
onerror捕获 send 失败——它只对底层传输错误有效,readyState不对时根本不会触发
WebSocketClient 类,而不是裸用原生 API。
# javascript
# java
# js
# 前端
# node.js
# json
# node
# 浏览器
# 端口
# websocket
# 后端
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何确保西部建站助手FTP传输的安全性?
高防服务器租用指南:配置选择与快速部署攻略
如何快速搭建高效可靠的建站解决方案?
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何选择PHP开源工具快速搭建网站?
EditPlus中的正则表达式 实战(1)
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
EditPlus中的正则表达式 实战(4)
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
Laravel如何使用Collections进行数据处理?(实用方法示例)
浅析上传头像示例及其注意事项
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Python3.6正式版新特性预览
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
Android GridView 滑动条设置一直显示状态(推荐)
如何彻底删除建站之星生成的Banner?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
node.js报错:Cannot find module 'ejs'的解决办法
Java类加载基本过程详细介绍
如何用免费手机建站系统零基础打造专业网站?
如何快速使用云服务器搭建个人网站?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
php json中文编码为null的解决办法
如何在企业微信快速生成手机电脑官网?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
浅谈redis在项目中的应用
如何实现javascript表单验证_正则表达式有哪些实用技巧
七夕网站制作视频,七夕大促活动怎么报名?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何快速重置建站主机并恢复默认配置?
Laravel中的Facade(门面)到底是什么原理
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
深圳网站制作平台,深圳市做网站好的公司有哪些?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
高性能网站服务器配置指南:安全稳定与高效建站核心方案
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
如何做网站制作流程,*游戏网站怎么搭建?
JS中对数组元素进行增删改移的方法总结
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel如何使用模型观察者?(Observer代码示例)
Linux网络带宽限制_tc配置实践解析【教程】
如何打造高效商业网站?建站目的决定转化率
上一篇:linux系统怎么安装vim
下一篇:linux入门看什么书
上一篇:linux系统怎么安装vim
下一篇:linux入门看什么书


