JS WebSocket 深度解析

JS WebSocket 深度解析


在这里插入图片描述

文章目录

      • JavaScript WebSocket 深度解析
        • 一、WebSocket 是什么
        • 二、JS 中如何使用 WebSocket
          • 1. 创建 WebSocket 对象
          • 2. 连接打开事件
          • 3. 监听消息事件
          • 4. 监听错误事件
          • 5. 关闭连接
        • 三、WebSocket 包含哪些属性或方法 API
          • 1. 属性
          • 2. 方法
        • 四、扩展与高级技巧
          • 1. 心跳检测
          • 2. 重连机制
          • 3. 消息分片与重组
          • 4. 安全性增强
          • 5. 兼容性处理
        • 五、优点与缺点
          • 优点
          • 缺点
        • 六、对应“八股文”或面试常问问题
          • 1. WebSocket 与 HTTP 的主要区别是什么?
          • 2. WebSocket 如何保证数据传输的安全性?
          • 3. WebSocket 连接过程中的状态码有哪些?
          • 4. WebSocket 的心跳检测有什么作用?
          • 5. WebSocket 的 `bufferedAmount` 属性有什么作用?
        • 七、总结与展望
        • 八、完整使用示例

JavaScript WebSocket 深度解析

一、WebSocket 是什么

WebSocket 是一种网络通信协议,它提供了浏览器和服务器之间的全双工通信渠道。与传统的 HTTP 请求相比,WebSocket 允许服务器主动向客户端发送信息,客户端也可以随时向服务器发送消息,实现了真正的双向即时通信。

二、JS 中如何使用 WebSocket
1. 创建 WebSocket 对象
const socket = new WebSocket('wss://example.com/socket');
2. 连接打开事件
socket.onopen = function(event) {console.log('Connection opened');
};
3. 监听消息事件
socket.onmessage = function(event) {console.log('Message from server ', event.data);
};
4. 监听错误事件
socket.onerror = function(event) {console.error('WebSocket error observed:', event);
};
5. 关闭连接
socket.onclose = function(event) {console.log('Connection closed');
};
三、WebSocket 包含哪些属性或方法 API
1. 属性
  • socket.readyState:表示连接状态,可以是 CONNECTING (0), OPEN (1), CLOSING (2), 或 CLOSED (3)。
  • socket.bufferedAmount:未发送至服务器的字节数。
2. 方法
  • socket.send(data):发送数据到服务器。
  • socket.close([code[, reason]]):关闭连接。
四、扩展与高级技巧
1. 心跳检测

案例

let heartbeatTimer = null;
const heartbeatInterval = 30000; // 心跳间隔时间,设为30秒// 开启心跳检测
function startHeartbeat() {heartbeatTimer = setInterval(() => {socket.send(JSON.stringify({ type: 'ping' }));}, heartbeatInterval);
}// 清除心跳检测
function clearHeartbeat() {if (heartbeatTimer) {clearInterval(heartbeatTimer);heartbeatTimer = null;}
}socket.onopen = function() {startHeartbeat();
};socket.onclose = function() {clearHeartbeat();
};
2. 重连机制

案例

let reconnectTimer = null;
const reconnectInterval = 5000; // 重连间隔时间,设为5秒function reconnect() {if (socket.readyState === WebSocket.CLOSED) {console.log('Attempting to reconnect...');socket = new WebSocket('wss://example.com/socket');socket.onopen = function() {console.log('Reconnection successful');startHeartbeat();};socket.onerror = function(event) {console.error('WebSocket error during reconnection:', event);};socket.onclose = function() {console.log('Reconnection closed, attempting again...');reconnect();};}
}socket.onclose = function() {clearHeartbeat();reconnectTimer = setInterval(reconnect, reconnectInterval);
};
3. 消息分片与重组

案例

let buffer = '';socket.onmessage = function(event) {const message = event.data;buffer += message;// 假设我们约定每个完整消息都以换行符结束const messages = buffer.split('\n');buffer = messages.pop(); // 保存最后一个不完整的消息片段messages.forEach(completeMessage => {console.log('Complete message received:', completeMessage);// 处理完整消息});
};
4. 安全性增强

使用 wss 协议,确保数据传输的安全性。这部分主要依赖于服务器端的配置,客户端在创建 WebSocket 对象时使用 wss:// 开头的 URL 即可。

5. 兼容性处理

对于不支持 WebSocket 的浏览器,可以提供降级方案,如使用长轮询(long polling)。这部分通常需要在服务器端进行逻辑处理,根据客户端的请求头或参数来判断是否使用 WebSocket。

五、优点与缺点
优点
  1. 真正的双向通信。
  2. 较少的控制开销。连接创建后,客户端和服务器之间交换数据时,用于协议控制的数据包头部相对较小。
  3. 更好的二进制支持。
  4. 没有同源限制,客户端可以与任意服务器通信。
缺点
  1. 少数浏览器不支持,且部分浏览器中的 WebSocket 受同源策略影响。
  2. 服务器端的逻辑比轮询复杂。
  3. 代理服务器配置可能较为复杂。
六、对应“八股文”或面试常问问题
1. WebSocket 与 HTTP 的主要区别是什么?

WebSocket 是全双工通信,而 HTTP 是请求/响应模式。

2. WebSocket 如何保证数据传输的安全性?

WebSocket 使用 wss(WebSocket Secure)协议,它是 WebSocket 协议的加密版本,相当于 HTTPS。

3. WebSocket 连接过程中的状态码有哪些?

WebSocket 连接过程中的状态码包括 CONNECTING (0), OPEN (1), CLOSING (2), 和 CLOSED (3)。

4. WebSocket 的心跳检测有什么作用?

心跳检测用于保持连接的活跃性,并检测对方是否仍然在线。

5. WebSocket 的 bufferedAmount 属性有什么作用?

bufferedAmount 属性表示还未发送至服务器的字节数,可以用来控制发送速率,避免发送过快导致数据丢失。

七、总结与展望

WebSocket 提供了一种高效的双向通信机制,非常适合需要实时数据交互的应用场景。随着技术的发展,WebSocket 将在更多领域得到应用,并成为实时通信的首选技术。

八、完整使用示例
const socket = new WebSocket('wss://example.com/socket');// 心跳检测和重连机制的代码可以放在这里socket.onopen = function(event) {console.log('Connection opened');socket.send('Hello Server!');
};socket.onmessage = function(event) {console.log('Message from server ', event.data);
};socket.onerror = function(event) {console.error('WebSocket error observed:', event);
};socket.onclose = function(event) {console.log('Connection closed');// 可以在这里实现重连机制
};

看到这里的小伙伴,欢迎点赞、评论,收藏!

如有前端相关疑问,博主会在第一时间解答,也同样欢迎添加博主好友,共同进步!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411080.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结果一。5.be doing表将来和 表 will的区别

be doing 表⽰近期、眼下就要发⽣的事情; will 表⽰将来的时间,则较远⼀些。如: He is going to write a letter tonight.He will write a book 。 be going to 表⽰根据主观判断将来肯定发⽣的事情。 will+ 动词原形表⽰⼀般将来时。 will ࿰

【xilinx】米联客ZYNQ MZ7100自学发现JTAG烧写失败

3-2-01米联客 2022 版 ZYNQ SOC SDK 入门篇 02 程序固化入门(SDK 方式) 生成了boot.bin 2.4.2 程序通过jtag烧不进去卡在performing erase operation 最终发现是spi的flash type 模式设置错误,文档和板卡没对应上 文档写的qspi-x4-single 实际用的qspi-x8-dual_par…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在当今这个视觉为王的时代,16:9横屏视频凭借其宽阔的画面和卓越的观看体验,已经成为许多视频创作者和营销专家的首选格式。如果你想制作出引人注目的横屏视频,选择高质量的视频素材库是关键。无论你是视频制作的老手还是刚入行的新手&#xf…

免费分享一套SpringBoot+Vue个人理财管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue个人理财管理系统,分享下哈。 项目视频演示 【免费】SpringbootVue个人理财管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入而广泛的应用&am…

【图像去噪】论文复现:代替ReLU!Pytorch实现即插即用激活函数模块xUnit,并插入到DnCNN中实现xDnCNN!

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中…

文章生成用这三款伪原创软件效果好

在当今信息爆炸的时代,无论是网站运营者、博主、作家还是学生,对文章的需求量越来越大。他们需要用大理的的原创文章来满足他们工作需求。然而,对于许多人来说,写作一篇优质的文章并非易事。这就产生了一种需求,那就是…

3 Python开发工具:VSCode+插件

本文是 Python 系列教程第 3 篇,完整系列请查看 Python 专栏。 Visual Studio Code的安装非常简单,就不放这里增加文章篇幅了。 相比PyCharm,VSCode更加轻量,启动速度快。并且搭配Python插件就能实现和Pycharm一样的代码提示、高…

如何将平淡无奇的产品推向市场?借助ChatGPT,仅需3秒即可化身短视频创意策划大师,助你的产品一夜成名!

毫无趣味的产品要如何宣传?用ChatGPT,3秒钟成为创意短视频策划高手,让你的产品出圈!© 由 ZAKER 提供 最近,全红婵最爱的小乌龟火了。 制作小乌龟的某位义乌商家在接受采访时,表示自己有了甜蜜的烦恼…

力扣刷题(2)

寻找两个正序数组的中位数 寻找两个正序数组的中位数-力扣 思路: 合并两个正序数组找中位数 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int arr[nums1Size nums2Size];int n1 0, n2 0;int m 0;int q;//合并两个正序数组w…

Git 远程操作

1. 理解分布式版本控制系统 我们所说的⼯作区,暂存区,版本库等,都是在本地!也就是在笔记本或计算机上。⽽我们的 Git 其实是分布式版本控制系统.可以简单理解为,我们每个⼈的电脑上都是⼀个完整的版本库,这…

Java 中的抽象工厂模式:优雅地掌握对象创建

文章目录 一、概述三、抽象工厂设计模式的意图四、抽象工厂模式的详细解释及实际示例五、Java 中抽象工厂模式的编程示例六、抽象工厂模式类图七、Java 中何时使用抽象工厂模式八、抽象工厂模式 Java 教程九、抽象工厂模式的优点和权衡十、Java 中抽象工厂模式的实际应用十一、…

【Web UI自动化测试】Web UI自动化测试之框架篇(全网最全)

本文大纲截图: UnitTest框架: PyTest框架: 框架: 框架英文单词 framework,为解决一类事情的功能的集合。需要按照框架的规定(套路)去书写代码。 一、UnitTest框架介绍【文末分享自动化测试学…

使用canal增量同步ES索引库数据

Canal增量数据同步利器 Canal介绍 canal主要用途是基于 MySQL 数据库增量日志解析,并能提供增量数据订阅和消费,应用场景十分丰富。 github地址:https://github.com/alibaba/canal 版本下载地址:https://github.com/alibaba/c…

鸿蒙开发:深入浅出Stage模型(UIAbility组件)

🚀一、UIAbility组件 🔎1.概述 HarmonyOS中的Stage模型是一种基于UIAbility组件的应用程序架构。UIAbility是HarmonyOS系统中用于构建用户界面的基本组件之一。它负责处理应用程序界面的显示和交互。 在Stage模型中,每个应用程序都有一个或…

LLM —— 强化学习(RLHF-PPO和DPO)学习笔记

强化学习整体流程 智能体执行动作与环境进行交互,根据奖励R的反馈结果不断进行更新。 价值函数 奖励将会考虑两个方面的奖励,一个当下的奖励,一个是未来的奖励(为了防止陷入局部最优解)。 LLM强化学习 强化学习模型分…

CTF—杂项学习

1 文件操作隐写 1.1 文件类型识别 1.1.1 File命令 当文件没有后缀名或有后缀名而无法打开时,根据识别出的文件类型来修改后缀名即可正常打开文件,file是Linux下的文件识别命令。 file 文件名 使用场景:不知道后缀名,无法打开文件…

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决 一、CoreMark简介二、创建CubeMX项目2.1 选择MCU2.2 配置CPU时钟2.3 配置串口功能2.4 配置LED引脚2.5 生成CMake项目 三、基础功能支持3.1 支持记录耗时3.2 支持printf输出…

SEO之网站结构优化(十三-网站地图)

** 初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: ** 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 网站无论大小&…

京存分布式赋能EDA应用

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。——《老子德经第六十四章》 EDA(Electronic Design Automation 电子设计自动化)是利用计算机,完成对VLSI (V…

OpenCV绘图函数(8)填充凸多边形函数fillConvexPoly()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 填充一个凸多边形。 函数 cv::fillConvexPoly 绘制一个填充的凸多边形。这个函数比 fillPoly 函数快得多。它可以填充的不仅仅是凸多边形&#…