JS WebSocket 深度解析

news2024/9/20 0:53:52

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.coloradmin.cn/o/2082621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微分方程(Blanchard Differential Equations 4th)中文版Section4.5

塔科马海峡大桥 1940年7月1日,耗资600万美元的塔科马海峡大桥正式通车。仅仅四个月后的11月7日,在一场风暴中,这座桥解体并倒塌。这座悬索桥全长超过一英里,曾在它短暂的使用期内因桥面在风中剧烈摆动而被称为“跳跃的格蒂”(Galloping Gertie)。大桥的倒塌不仅成为一场…

KAN+Transformer,一个快速发论文的新创新点!

KAN爆火至今,关于它和Transformer谁更强的问题还没定论,这俩结合的工作效果却愈发出众了,短时间内就有了不少高质量论文发表。 不得不说,这是一种富有创新性的尝试,利用了KAN的灵活性和可解释性,以及Trans…

ocr识别遇到的问题(nested exception is java.lang.UnsatisfiedLinkError)

目录 前言: 问题描述: 解决思路: 解决方法: 总结反思: 前言: 上篇讲过我使用冰蓝的jar包在Java 项目中扫描识别图片中的文字,这篇写更新上线中遇到的问题。 问题描述: 项目打…

c++习题26-大整数加法

目录 一,题目 二,思路 三,代码 一,题目 描述 求两个不超过200位的非负整数的和。 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 输出 一行,即相加后的结果。结果里不…

论文合作容易踩坑?学术大咖为你揭秘合作研究中的潜规则

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 知乎上的话题,引发大家热议。因为如今合作发表论文在学术圈越来越普遍了。 随着低垂果实都发表了,大家在自己的领域越做越细分,再加上人工智…

WiFi标签注册(电脑版)

安装WiFi-Tool工具 需要windows系统电脑并且有WiFi功能 下载软件安装包:http://a.picksmart.cn:8088/picksmart/app/WiFi-Tool-Setup-V1.0.37.zip 配置操作流程 登录WiFi标签管理系统到设备管理-产品管理,复制“产品ApiKey”参数,打开“WiFi-…

day-42 分割字符频率相等的最少子字符串

思路 动态规划的思想&#xff0c;dp[i]表示从s[0]到s[i]这一子串的最少平衡子串数&#xff0c;当s[i]到s[n-1]是平衡字符串时&#xff0c;dp[i]dp[j-1]1,所以状态转换方程为dp[i]Math.min(dp[j-1]1)&#xff08;1<j<i&#xff09; 解题过程 判断是否为平衡字符串&#x…

《上海服饰》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《上海服饰》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《上海服饰》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;上海世纪出版&#xff08;集团&#xff09;有限公司…

Leetcode 98 验证二叉搜索树 C++实现

Leetcode 98. 验证二叉搜索树 问题&#xff1a;给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身…

【Python入门】第2节 判断语句

&#x1f4d6;第2节 判断语句 ✅布尔类型和比较运算符✅if语句的基本格式✅if else 语句✅if elif else语句✅判断语句的嵌套 ✅布尔类型和比较运算符 布尔&#xff08;bool&#xff09;表达现实生活中的逻辑&#xff0c;即真和假 True表示真 False表示假。 True本质上是一…

代码随想录训练营 Day41打卡 动态规划 part08 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机II 123. 买卖股票的最佳时机III

代码随想录训练营 Day41打卡 动态规划 part08 一、力扣121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计…

【计算机系统架构】从0开始构建一台现代计算机|时序逻辑、主存储器|第3章

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a; 【计算机系统架构】从0开始构建一台现代计算机|二进制、布尔运算和ALU|第2章每日一言&#x1f33c;: 孤独和喧嚣都令人难以忍受。如果一定要忍…

【精选】基于B_S架构的智慧校园系统的设计与实现(全网独一无二,阿龙原创开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

5分钟搞定!最好用的6款写论文专用神器APP软件

在当今学术研究和写作领域&#xff0c;AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是8款推荐的AI论文写作工具&#xff0c;包括千笔-AIPassPaper&#xff0c;帮助你更…

AOP自定义注解防重

Spring Boot 防重提交注解实现与实战示例 在Web开发中&#xff0c;防止用户重复提交表单是一个常见的需求。本文将详细介绍如何在Spring Boot中通过自定义注解和AOP技术实现防重提交功能&#xff0c;并提供一个完整的示例。 一、背景介绍 重复提交问题通常出现在用户在短时间…

来自OpenAI官网的Function calling介绍与最佳实践

学习如何将大型语言模型连接到外部工具。 介绍 函数调用允许您将模型如gpt-4o与外部工具和系统连接起来。这对于许多事情都很有用&#xff0c;比如为AI助手赋能&#xff0c;或者在你的应用程序与模型之间建立深度集成。 在2024年8月&#xff0c;我们推出了结构化输出功能。当…

8月27日笔记

活动目录的访问 AD Explorer LDAP&#xff08; Lightweight Directory Access Protocol&#xff0c;轻量目录访问协议&#xff09;是一种基于TCP/IP的应用层协议&#xff0c;用于访问和维护分布式目录信息服务。它允许用户在一个网络中查找和管理存储在目录服务中的信息。是在…

SCADA 系统开启车间智能可视化

在当今高速发展的工业时代&#xff0c;车间的高效运作与精准管理至关重要。然而在自动化设备、仪表、传感器等应用的现今&#xff0c;其产生的数据越来越庞大&#xff0c;要想将这些数据充分利用起来&#xff0c;并且形成更易分析的信息&#xff0c;则需要SCADA 系统来进行采集…

参数高效的迁移学习在自然语言处理中的应用

人工智能咨询培训老师叶梓 转载标明出处 迁移学习技术&#xff0c;尤其是针对大型预训练模型的微调&#xff08;fine-tuning&#xff09;&#xff0c;在诸多下游任务中展现出了卓越的性能。然而&#xff0c;当面临众多任务时&#xff0c;传统的微调方法存在参数效率低下的问题…

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

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