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.code和event.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 秒
- 用户切换页面或休眠时,可监听
visibilitychange或pagehide事件暂停重连,恢复后再尝试 - 避免频繁重连导致服务端压力,可在后端记录客户端心跳或使用连接令牌校验合法性
# 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实例
如何彻底卸载建站之星软件?

