JavaScript如何实现实时通信_WebSocket如何建立连接?

发布时间 - 2025-12-26 00:00:00    点击率:
WebSocket是浏览器与服务器间持久化双向通信标准,需用ws://或wss://协议创建实例,监听onopen、onmessage、onerror、onclose事件,支持文本/JSON/二进制收发,并应实现指数退避重连策略。

WebSocket 是浏览器与服务器之间建立持久化双向通信通道的标准方式,相比轮询或长连接更高效、低延迟。要实现实时通信,核心是正确创建 WebSocket 实例并处理连接生命周期。

创建 WebSocket 连接

使用 new WebSocket(url) 即可发起连接,url 必须以 ws://(非加密)或 wss://(加密,推荐)开头,不能用 http:// 或 https://。

  • 例如:const ws = new WebSocket("wss://echo.websocket.org");(测试用公共回显服务)
  • 若后端运行在本地 Node.js 服务(如用 ws 库),地址可能是 "ws://localhost:8080"
  • 连接时可携带参数,如 "wss://api.example.com/chat?user=123",后端可通过 upgradeReq.url 解析查询字符串

监听关键事件

WebSocket 对象提供多个事件回调,用于响应连接状态变化和收发数据:

  • onopen:连接成功建立后触发,此时可立即发送消息
  • onmessage:收到服务器推送的消息时触发,event.data 是文本或 Blob/ArrayBuffer
  • onerror:连接失败或发生异常时触发(注意:它不表示连接关闭,也不替代 onclose)
  • onclose:连接被关闭时触发,event.codeevent.reason 可帮助判断原因(如 1000 正常关闭,1006 异常断连)

发送与接收数据

WebSocket 默认以文本(UTF-8 字符串)通信,也可传输二进制数据:

  • 发送文本:ws.send("hello server")
  • 发送 JSON:ws.send(JSON.stringify({ type: "login", userId: 42 }))
  • 发送二进制(如 ArrayBuffer):ws.send(new Uint8Array([1,2,3]).buffer)
  • 接收时判断类型:if (typeof event.data === "string") { ... } else if (event.data instanceof Blob) { ... }

连接管理与重连策略

真实场景中网络不稳定,需主动管理连接状态:

  • 连接关闭后不要直接复用原实例,应新建 new WebSocket(...)
  • 建议实现指数退避重连:首次 1 秒后重试,失败则 2 秒、4 秒、8 秒……上限设为 30 秒
  • 用户切换页面或休眠时,可监听 visibilitychangepagehide 事件暂停重连,恢复后再尝试
  • 避免频繁重连导致服务端压力,可在后端记录客户端心跳或使用连接令牌校验合法性


# javascript  # java  # js  # node.js  # json  # node  # 浏览器  # websocket  # 后端 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何在橙子建站上传落地页?操作指南详解  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Java遍历集合的三种方式  Laravel如何创建自定义Artisan命令?(代码示例)  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  详解Huffman编码算法之Java实现  如何自定义建站之星网站的导航菜单样式?  微信小程序 require机制详解及实例代码  jquery插件bootstrapValidator表单验证详解  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  郑州企业网站制作公司,郑州招聘网站有哪些?  如何确保FTP站点访问权限与数据传输安全?  详解阿里云nginx服务器多站点的配置  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  如何获取上海专业网站定制建站电话?  JS碰撞运动实现方法详解  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何用花生壳三步快速搭建专属网站?  Android实现代码画虚线边框背景效果  如何快速搭建FTP站点实现文件共享?  bootstrap日历插件datetimepicker使用方法  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  公司门户网站制作流程,华为官网怎么做?  如何挑选高效建站主机与优质域名?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  高防服务器租用如何选择配置与防御等级?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何在Ubuntu系统下快速搭建WordPress个人网站?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  北京企业网站设计制作公司,北京铁路集团官方网站?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何选择PHP开源工具快速搭建网站?  如何快速查询域名建站关键信息?  如何用wdcp快速搭建高效网站?  如何彻底删除建站之星生成的Banner?  如何快速搭建二级域名独立网站?  怎样使用JSON进行数据交换_它有什么限制  Android使用GridView实现日历的简单功能  微信小程序制作网站有哪些,微信小程序需要做网站吗?  EditPlus中的正则表达式实战(5)  QQ浏览器网页版登录入口 个人中心在线进入  使用spring连接及操作mongodb3.0实例  如何彻底卸载建站之星软件?