【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 提供了一种在客户端和服务器之间建立持久连接的机制,使得实时数据的传输变得更加简单和高效。
🏝 1. 什么是 WebSockets API
1.1 概念介绍
WebSockets API 「允许在浏览器和服务器之间进行双向通信」。相比传统的 HTTP 请求-响应模式,WebSockets 允许服务器主动向客户端推送数据,实现实时性和双向通信。它建立在标准的 HTTP 协议之上,使用标准的 WebSocket URL 进行通信。
1.2 作用和使用场景
WebSockets API 有许多有用的场景场景,包括实时聊天应用、多人协作工具、实时数据监控和游戏等。通过使用 WebSockets,开发者可以轻松地实现实时更新、即时通知和实时数据传输等功能,提供更好的用户体验。
🎨 2. 如何使用 WebSockets API
WebSockets API 的使用相对简单,只需要几个基本步骤:
「建立 WebSocket 连接」
在客户端代码中,使用 JavaScript 创建一个 WebSocket 对象,并通过 WebSocket URL 建立与服务器的连接。
const socket = new WebSocket("ws://example.com/socket"); 「处理连接事件」
在连接建立后,WebSocket 对象会触发不同的事件,我们可以监听这些事件来处理连接状态和接收数据。
socket.onopen = () => {console.log("WebSocket 连接已建立");
};socket.onmessage = (event) => {console.log("收到消息:", event.data);
};socket.onclose = () => {console.log("WebSocket 连接已关闭");
}; 「发送和接收数据」
通过 WebSocket 对象的 send() 方法发送数据到服务器,服务器可以使用 send() 方法将数据发送给客户端。
// 发送数据
socket.send("Hello, Server!");// 接收数据
socket.onmessage = (event) => {console.log("收到消息:", event.data);
}; 「关闭连接」
当不再需要使用 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+✅
可以在 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 的情况。
「处理连接中断」
在客户端代码中,需要处理连接中断和错误的情况,例如网络故障或服务器断开连接。可以通过监听 onclose 和 onerror 事件来捕获这些情况。
「安全性措施」
确保对 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 问题
#
试着换个角度理解低代码平台设计的本质

回复“加群”,一起学习进步
相关文章:
【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是可以改变大小的数组的容器。其内存结构和数组一样,使用连续的存储…...
玻璃制品行业丨外贸业务管理难点及解决方案
玻璃作为一种重要的建筑材料,在国际贸易中一直占有一定的份额。随着国外市场需求量的不断增加,对玻璃制品的技术含量要求越来越高,需要在研发方面的投入也逐步加大。由于国际市场竞争激烈,想要做玻璃制品行业的外贸公司࿰…...
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…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
