当前位置: 首页 > news >正文

【JS】1699- 重学 JavaScript API - WebSockets API

f4c398943c1111017a971fac6744af88.jpeg

前期回顾:

1. Page Visibility API

2. Broadcast Channel API

3. Beacon API

4. Resize Observer API

5. Clipboard API

6. Fetch API

7. Performance API

8. Web Storage API

WebSockets API 提供了一种在客户端和服务器之间建立持久连接的机制,使得实时数据的传输变得更加简单和高效。

🏝 1. 什么是 WebSockets API

1.1 概念介绍

WebSockets API 「允许在浏览器和服务器之间进行双向通信」。相比传统的 HTTP 请求-响应模式,WebSockets 允许服务器主动向客户端推送数据,实现实时性和双向通信。它建立在标准的 HTTP 协议之上,使用标准的 WebSocket URL 进行通信。

1.2 作用和使用场景

WebSockets API 有许多有用的场景场景,包括实时聊天应用、多人协作工具、实时数据监控和游戏等。通过使用 WebSockets,开发者可以轻松地实现实时更新、即时通知和实时数据传输等功能,提供更好的用户体验。

🎨 2. 如何使用 WebSockets API

WebSockets API 的使用相对简单,只需要几个基本步骤:

  1. 「建立 WebSocket 连接」

在客户端代码中,使用 JavaScript 创建一个 WebSocket 对象,并通过 WebSocket URL 建立与服务器的连接。

const socket = new WebSocket("ws://example.com/socket");
  1. 「处理连接事件」

在连接建立后,WebSocket 对象会触发不同的事件,我们可以监听这些事件来处理连接状态和接收数据。

socket.onopen = () => {console.log("WebSocket 连接已建立");
};socket.onmessage = (event) => {console.log("收到消息:", event.data);
};socket.onclose = () => {console.log("WebSocket 连接已关闭");
};
  1. 「发送和接收数据」

通过 WebSocket 对象的 send() 方法发送数据到服务器,服务器可以使用 send() 方法将数据发送给客户端。

// 发送数据
socket.send("Hello, Server!");// 接收数据
socket.onmessage = (event) => {console.log("收到消息:", event.data);
};
  1. 「关闭连接」

当不再需要使用 WebSocket 连接时,可以通过调用 WebSocket 对象的 close() 方法来关闭连接。

socket.close();

🧭 3. WebSockets API 的实际应用

WebSockets API 在许多实际应用中发挥着重要作用。下面是几个常见的应用场景:

3.1 实时聊天应用

WebSockets 可以用于构建实时聊天应用,其中用户可以实时地发送和接收消息。通过建立持久的 WebSocket 连接,用户可以即时收到其他用户发送的消息,从而实现实时的聊天体验。

// 客户端代码
const socket = new WebSocket("ws://example.com/chat");socket.onmessage = (event) => {const message = JSON.parse(event.data);displayMessage(message);
};function sendMessage(message) {socket.send(JSON.stringify(message));
}

3.2 实时数据监控

WebSockets 可以用于监控实时数据的变化。例如,一个实时股票市场监控应用可以通过 WebSocket 连接获取实时的股票价格,并将其实时显示给用户。

// 客户端代码
const socket = new WebSocket("ws://example.com/stocks");socket.onmessage = (event) => {const stockData = JSON.parse(event.data);displayStockPrices(stockData);
};

3.3 游戏开发

WebSockets API 为多人游戏开发提供了强大的基础。游戏服务器可以使用 WebSockets 与客户端建立双向通信,并实时传输游戏状态和玩家的动作。

// 客户端代码
const socket = new WebSocket("ws://example.com/game");socket.onmessage = (event) => {const gameData = JSON.parse(event.data);updateGame(gameData);
};function sendPlayerAction(action) {socket.send(JSON.stringify(action));
}

📋 4. 兼容性和优缺点

4.1 兼容性

以下是 WebSockets API 的兼容性列表,包含了主流浏览器及其支持的最低版本:

  • Chrome 4+✅

  • Firefox 4+✅

  • Safari 5+✅

  • Edge 12+✅

  • Opera 11.5+✅

  • Internet Explorer 10+✅

  • iOS Safari 4.2+✅

  • Android Browser 4.4+✅

  • Chrome for Android 33+✅

  • Firefox for Android 4+✅

cbd71a9892071882b3d7d0583afda24f.png

可以在 Can I use[1] 网站上查看 WebSockets API 的兼容性详情。

4.2 优缺点

WebSockets API 具有以下优点:

  • 「实时性」

通过建立持久连接,实现「实时数据传输」「双向通信」

  • 「较低的延迟」

相比传统的轮询机制,WebSockets 可以「减少无效的请求和响应」,降低延迟。

  • 「节省带宽」

由于「不需要频繁的请求和响应」,WebSockets 在传输数据方面更加高效。

然而,WebSockets API 也有一些缺点:

  • 「兼容性问题」

尽管现代浏览器广泛支持 WebSockets,但某些旧版本浏览器可能不支持或存在一些限制。在设计应用程序时,需要考虑到兼容性问题,并提供备选方案来处理不支持 WebSockets 的情况。

  • 「服务器开销」

与传统的 HTTP 请求-响应模式相比,WebSockets 需要服务器维护持久连接,这可能增加服务器的负载。

  • 「安全性考虑」

由于 WebSockets 允许服务器主动推送数据到客户端,因此需要仔细考虑安全性问题,防止潜在的安全漏洞。

4.3 工具推荐

推荐几个常用工具:

  • Socket.IO[2] 58.2K⭐

一个面向实时应用程序的 JavaScript 框架,提供了跨浏览器的双向通信。它支持实时聊天、实时分析和实时协作等场景。

  • ws[3] 19.8K⭐

一个简单易用的 WebSocket 客户端和服务器库,适用于 Node.js。它提供了基本的 WebSocket 功能,并支持自定义扩展。

  • uWebSockets[4] 15.4K⭐

一个快速、轻量级的 WebSocket 库,可用于构建高性能的实时应用程序。它提供了简单易用的接口,并支持多线程和事件驱动的架构。

  • SignalR[5] 8.9K⭐

一个为 ASP.NET 开发人员提供的实时 Web 功能库,可在浏览器和服务器之间建立双向通信。它支持多种客户端技术,包括 JavaScript、.NET 和 Xamarin。

  • sockjs-client[6] 8.2K⭐

一个用于创建跨浏览器实时应用程序的 JavaScript 库,它提供了类似 WebSocket 的 API,并在不支持 WebSocket 的浏览器中使用轮询技术进行回退。

👍 5. 使用建议和注意事项

以下是一些使用建议和注意事项:

  • 「考虑兼容性」

在设计和实施应用程序时,需要考虑到不同浏览器和平台的兼容性,并提供备选方案来处理不支持 WebSockets 的情况。

  • 「处理连接中断」

在客户端代码中,需要处理连接中断和错误的情况,例如网络故障或服务器断开连接。可以通过监听 oncloseonerror 事件来捕获这些情况。

  • 「安全性措施」

确保对 WebSocket 连接进行适当的安全性措施,以防止潜在的安全漏洞和攻击。使用安全的连接(wss://)和合适的认证和授权机制。

  • 「考虑服务器负载」

由于 WebSockets 需要维护持久连接,服务器的负载可能会增加。在设计服务器架构时,需考虑负载均衡和扩展性。

  • 「数据传输量控制」

注意控制数据传输量,避免过多的数据传输对带宽和性能产生负面影响。

🍭 6. 总结

WebSockets API 为实时性和双向通信提供了便捷的解决方案。通过使用 WebSockets,开发者可以轻松构建实时聊天应用、实时数据监控和多人游戏等应用程序。WebSockets API 的广泛支持和强大功能使其成为现代 Web 开发中不可或缺的一部分。通过合理的使用和注意事项,我们可以充分利用 WebSockets 实现更好的用户体验和功能。

🎯 7. 拓展阅读

  • WebSockets API 文档[7]

  • WebSockets 兼容性[8]

  • Introducing WebSockets - Bringing Sockets to the Web[9]

Reference

[1]

Can I use: https://caniuse.com/?search=websockets

[2]

Socket.IO: https://socket.io/

[3]

ws: https://github.com/websockets/ws

[4]

uWebSockets: https://github.com/uWebSockets/uWebSockets

[5]

SignalR: https://github.com/SignalR/SignalR

[6]

sockjs-client: https://github.com/sockjs/sockjs-client

[7]

WebSockets API 文档: https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

[8]

WebSockets 兼容性: https://caniuse.com/websockets

[9]

Introducing WebSockets - Bringing Sockets to the Web: https://web.dev/websockets-basics/

往期回顾

#

如何使用 TypeScript 开发 React 函数式组件?

#

11 个需要避免的 React 错误用法

#

6 个 Vue3 开发必备的 VSCode 插件

#

3 款非常实用的 Node.js 版本管理工具

#

6 个你必须明白 Vue3 的 ref 和 reactive 问题

#

6 个意想不到的 JavaScript 问题

#

试着换个角度理解低代码平台设计的本质

4ecdb1c50918701d7a7a6ffc58072049.gif

回复“加群”,一起学习进步

相关文章:

【JS】1699- 重学 JavaScript API - WebSockets API

❝ 前期回顾: 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API 8. Web Storage API ❞ WebSockets API 提供了一种在客户端和服务器之间建立持久连接的机制,使…...

String s = new String(“xyz“) 创建了几个对象?

这个问题相信每个学习 java 的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必…...

STL库(1)

STL库(1) vectorvector介绍vector使用初始化元素访问内存扩容插入删除 listlist介绍初始化,元素访问插入删除元素 vector和list区别 vector vector介绍 vector是可以改变大小的数组的容器。其内存结构和数组一样,使用连续的存储…...

玻璃制品行业丨外贸业务管理难点及解决方案

玻璃作为一种重要的建筑材料,在国际贸易中一直占有一定的份额。随着国外市场需求量的不断增加,对玻璃制品的技术含量要求越来越高,需要在研发方面的投入也逐步加大。由于国际市场竞争激烈,想要做玻璃制品行业的外贸公司&#xff0…...

Spring Boot如何实现自定义Spring Boot启动器

Spring Boot如何实现自定义Spring Boot启动器 在Spring Boot中,启动器(Starter)是一组依赖项的集合,它们一起提供了某个特定的功能。使用Spring Boot启动器可以让我们更加方便地集成第三方库和框架,并且可以避免版本冲…...

【面试题HTTP中的两种请求方法】GET 和 POST 有什么区别?

GET 和 POST 有什么区别? 1.相同点和最本质的区别1.1 相同点1.2 最本质的区别 2.非本质区别2.1 缓存不同2.2 参数长度限制不同2.3 回退和刷新不同2.4 历史记录不同2.5 书签不同 总结代码示例 GET 和 POST 是 HTTP 请求中最常用的两种请求方法,在日常开发…...

Allegro16.6详细教程(三)

確定Pad的層面 (1)用Single layer mode開關來控制pad type 勾選Single layer mode,則pad為單面孔,比如SMD 不勾選Single layer mode,則pad為通孔,比如:via (2)用滑鼠左鍵點選BEGIN LAYER彈出下面3個欄位 Regular, Thermal Relief, Anti Pad;Regular用於正片,Thermal R…...

Python3数据分析与挖掘建模(6)离散分布分析示例

1. 离散分布分析示例 相关库: pandas详细用法 numpy详细用法 1.1 引入算法库 # 引入 pandas库 import pandas as pd # 引入 numpy库 import numpy as np# 读取数据 dfpd.read_csv("data/HR.csv")# 查看数据 df Out[6]: satisfaction_level last_eval…...

汇编语言程序设计基础知识二

五、顺序结构 1、程序设计的步骤 1、分析问题 2、建立数据模型 3、设计算法 4、编制程序 5、上机调试 2、流程图的应用 3、程序的基本控制结构 1、顺序结构:程序顺序执行,不发生跳转 2、分支结构:程序在执行过程中发生跳转 3、循环…...

一文详解!Robot Framework Selenium UI自动化测试入门篇

目录 前言: 自动化框架的选择 测试环境的搭建 导入Selenium2Library包 关键字是什么? 创建测试用例 前言: 自动化测试的重要性越来越受到人们的重视,因为它可以提高测试效率、降低测试成本并减少人为错误的出现。为了满足这…...

Java 9 模块化系统详解

Java 9 模块化系统详解 一、简介1. 引入模块化系统原因2. 模块化系统带来的优势和挑战3. 模块化关键概念 二、模块化基础1. 模块化源代码结构规范2. 模块定义与描述符3. 打包可执行模块 三、模块化系统的高级特性1. 模块发现与解决依赖2. 模块化升级与替换3. 模块化动态访问 四…...

Windows定时执行Python脚本

在Linux环境下我们可以使用crontab工具来定时的执行脚本,可以很轻松的管理各个虚拟环境下的py文件在Windows上可以使用任务计划程序来定时执行我们的脚本 关于这个的基本使用可以查看我前面的博客 https://blog.csdn.net/wyh1618/article/details/125725967?spm10…...

数据科学简介:如何使用 Pandas 库处理 CSV 文件

部分数据来源:ChatGPT 什么是 CSV 文件? CSV ( Comma Separated Values)文件是一种常见的文本文件格式,它通常用于存储结构化数据,因为它可以轻松地转换成电子表格,如Excel。 CSV 文件是以逗号作为分隔符的表格数据。文件中的每行代表一个记录,每列代表一个属性。例如…...

面试专题:java多线程(2)-- 线程池

1.为什么要用线程池? 线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。 这里借用《Java并发编程的艺术》提到的来说一下使用线程池的好处: 降低资源消…...

Linux文件权限及用户管理

文件权限 在Linux中,每个文件和目录都有一组权限,这些权限决定了哪些用户可以访问文件或目录,以及他们可以进行什么样的操作。权限分为三类: 所有者权限:这些权限适用于文件或目录的所有者。 组权限:这些…...

以AI为灯,照亮医疗放射防护监管盲区

相信绝大部分人都有在医院拍X光片的经历,它能够让医生更方便快速地找出潜在问题,判断病人健康状况,是医疗诊断过程中的常见检查方式。但同时X射线也是一把双刃剑,它的照射量可在体内累积,对人体血液白细胞有杀伤力&…...

Golang单元测试详解(一):单元测试的基本使用方法

Golang 单元测试 Golang 中的单元测试是使用标准库 testing 来实现的,编写一个单元测试是很容易的: 创建测试文件:在 Go 项目的源代码目录下创建一个新的文件(和被测代码文件在同一个包),以 _test.go 为后…...

数据库的序列

目录 一、序列是什么 二、序列的用途 二、创建序列 三、查看、修改、删除序列 四、使用序列 (1)在插入语句中使用 (2)不在插入语句中使用 五、使用序列的例子 一、序列是什么 数据库对象分为:用户、视图、索引…...

2022年回顾

年总写完了(已持续多年),顺便写个小的回顾。 寻找属于自己的方向 无论当前干啥,大多数都不是真正适合你的,但是,你又不能不做下去,那么,持续的寻找适合的,就是一种解开…...

40亿个QQ号,限制1G内存,如何去重?

40亿个unsigned int,如果直接用内存存储的话,需要: 4*4000000000 /1024/1024/1024 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的。 想要实现这个功能,可以借助位图。 使用位图的话&a…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

【AI学习】三、AI算法中的向量

在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

JVM 内存结构 详解

内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: ​ 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

go 里面的指针

指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...