「JavaScript深入」WebSocket:高效的双向实时通信技术

WebSocket

    • WebSocket 的特点
      • 1. 全双工通信
      • 2. 持久连接
      • 3. 低延迟
      • 4. 二进制和文本支持
      • 5. 连接管理
      • 6. 二进制数据传输
    • WebSocket 协议详解
      • 1. 握手过程
      • 2. 数据帧结构
    • WebSocket 的实现
      • 服务器端实现(Node.js + ws库)
      • 1. 基础服务器
      • 2. 广播功能实现
      • 3. 心跳机制
      • 客户端实现(HTML + JavaScript)
      • 1. 基础用法
      • 2. 断线重连
      • 3. 二进制数据处理
    • WebSocket 与 SSE 的比较
    • WebSocket 的应用场景
    • WebSocket优化实践
      • 1. 性能优化
      • 2. 安全防护
      • 3. 监控与调试
    • 未来发展趋势
    • 总结

在现代 Web 开发中,实时通信是许多应用的核心需求,例如在线聊天、实时协作、游戏对战等。WebSocket 是一种基于 TCP 的全双工通信协议,它允许客户端和服务器之间建立持久连接,并在双方之间高效地传输数据。

上一节分享了 「Server-Sent Events (SSE):轻量级实时通信技术」


WebSocket 的特点

1. 全双工通信

WebSocket 允许客户端和服务器双向发送消息,适用于需要频繁交互的场景,如即时聊天、在线游戏等。

// 客户端发送消息
socket.send('Hello Server!');// 同时接收消息
socket.onmessage = (event) => {console.log('收到服务端消息:', event.data);
};
  • 双向实时: 客户端和服务端可以同时发送和接收数据

2. 持久连接

WebSocket 连接一旦建立,将保持打开状态,避免了 HTTP 轮询带来的性能损耗。

3. 低延迟

由于 WebSocket 仅在初始握手时使用 HTTP,之后的数据传输采用轻量级的帧格式,减少了额外的 HTTP 请求开销,提高了实时性。

4. 二进制和文本支持

WebSocket 支持发送文本数据和二进制数据,使其适用于多种应用场景,如音视频流、文件传输等。

5. 连接管理

相比 SSE(Server-Sent Events)只能由服务器推送数据,WebSocket 允许双向通信,因此需要手动管理连接的建立、丢失和恢复。

6. 二进制数据传输

// 发送ArrayBuffer
const buffer = new ArrayBuffer(128);
socket.send(buffer);// 发送Blob数据
const blob = new Blob(['Hello']);
socket.send(blob);
  • 原生支持: 无需编码转换,直接传输二进制数据

  • 高效传输: 适合音视频流、文件传输等场景

  • 类型灵活: 支持 ArrayBufferBlob、字符串等多种格式


WebSocket 协议详解

1. 握手过程

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
  • 协议升级: 通过 HTTP Upgrade 机制切换到 WebSocket 协议

  • 安全验证: 基于 Sec-WebSocket-Key 的握手验证

  • 状态码: 成功返回 101 Switching Protocols

2. 数据帧结构

  • 帧类型: 文本帧(0x1)、二进制帧(0x2)、控制帧等

  • 分片传输: 支持将大消息拆分为多个帧传输

  • 掩码处理: 客户端到服务端的数据需进行掩码处理


WebSocket 的实现

服务器端实现(Node.js + ws库)

1. 基础服务器

const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });server.on('connection', socket => {console.log('Client connected');// 监听客户端消息socket.on('message', message => {console.log('Received:', message);socket.send(`Echo: ${message}`); // 发送回执消息});// 监听连接关闭socket.on('close', () => {console.log('Client disconnected');});
});console.log('WebSocket server running on ws://localhost:8080');

2. 广播功能实现

// 向所有客户端广播消息
wss.clients.forEach((client) => {if (client.readyState === WebSocket.OPEN) {client.send('广播消息');}
});

3. 心跳机制

// 服务端心跳检测
setInterval(() => {wss.clients.forEach((ws) => {if (!ws.isAlive) return ws.terminate();ws.isAlive = false;ws.ping();});
}, 30000);ws.on('pong', () => {ws.isAlive = true;
});

客户端实现(HTML + JavaScript)

1. 基础用法

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebSocket Demo</title><script>document.addEventListener("DOMContentLoaded", function () {const socket = new WebSocket('ws://localhost:8080');// 连接成功socket.onopen = function() {console.log('WebSocket connection established');socket.send('Hello Server!');};// 收到消息socket.onmessage = function(event) {console.log('Received:', event.data);};// 连接关闭socket.onclose = function() {console.log('WebSocket connection closed');};});</script>
</head>
<body><h1>WebSocket Demo</h1><p>Check the console for messages.</p>
</body>
</html>

2. 断线重连

let reconnectAttempts = 0;
const maxReconnectAttempts = 5;function connect() {const socket = new WebSocket('wss://example.com/chat');socket.onclose = () => {if (reconnectAttempts < maxReconnectAttempts) {setTimeout(connect, Math.pow(2, reconnectAttempts) * 1000);reconnectAttempts++;}};
}

3. 二进制数据处理

// 接收ArrayBuffer
socket.binaryType = 'arraybuffer';
socket.onmessage = (event) => {const buffer = event.data;// 处理二进制数据
};// 发送二进制数据
const buffer = new ArrayBuffer(32);
socket.send(buffer);

WebSocket 与 SSE 的比较

特性WebSocketSSE
通信方式双向通信服务器到客户端单向推送
适用场景聊天、游戏、实时协作实时通知、日志更新、股票行情
连接管理需手动管理重连浏览器自动重连
数据格式支持二进制和文本仅支持文本
浏览器支持现代浏览器均支持现代浏览器均支持

WebSocket 的应用场景

  • 即时通讯:WebSocket 非常适用于在线聊天、协作工具,如 Slack、微信 Web 版等【即时消息传递、在线状态更新、消息已读回执】。
  • 在线游戏:多人在线游戏需要实时同步状态,WebSocket 由于其低延迟特性,是理想选择。
  • 实时数据推送:股票、外汇等金融市场数据需要高频率推送,WebSocket 提供了高效的数据传输方式。
  • 实时协作:如 Google Docs 这样的多人协作文档编辑工具,可使用 WebSocket 实现多个用户的实时同步【协同文档编辑、远程白板】。
  • 物联网(IoT):WebSocket 可用于智能设备与服务器之间的通信,以实现远程监控和控制。

WebSocket优化实践

1. 性能优化

  • 压缩扩展:启用 permessage-deflate 压缩

  • 连接池:合理管理 WebSocket 连接

  • 负载均衡:使用支持 WebSocket 的负载均衡器

2. 安全防护

// 认证示例
wss.on('connection', (ws, req) => {const token = req.headers['sec-websocket-protocol'];if (!validateToken(token)) {ws.close(1008, '未授权访问');}
});
  • 认证授权:通过子协议或自定义头进行身份验证

  • 数据加密:强制使用wss(WebSocket Secure)

  • 输入验证:严格校验客户端数据

3. 监控与调试

  • 连接状态:实时监控连接数和消息吞吐量

  • 错误日志:记录连接异常和错误信息

  • 性能指标:跟踪消息延迟和资源使用情况


未来发展趋势

1. WebSocket over HTTP/3: 利用QUIC协议提升性能

2. WebTransport: 新一代实时通信协议

3. 边缘计算集成: 与CDN和边缘节点深度整合

4. 标准化扩展: 更丰富的子协议支持


总结

WebSocket 提供了一种高效、低延迟的双向通信方式,适用于各种需要实时交互的应用。相比于 SSE,它不仅支持服务器向客户端推送数据,还允许客户端主动发送数据,实现真正的实时双向通信。

如果你的应用涉及高频双向数据交换,如聊天、游戏或协作工具,WebSocket 是最佳选择!

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

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

相关文章

第2.2节 Android Jacoco插件覆盖率采集

JaCoCo&#xff08;Java Code Coverage&#xff09;是一款开源的代码覆盖率分析工具&#xff0c;适用于Java和Android项目。它通过插桩技术统计测试过程中代码的执行情况&#xff0c;生成可视化报告&#xff0c;帮助开发者评估测试用例的有效性。在github上开源的项目&#xff…

OpenGL ES ->乒乓缓冲,计算只用两个帧缓冲对象(Frame Buffer Object)+叠加多个滤镜作用后的Bitmap

乒乓缓冲核心思想 不使用乒乓缓冲&#xff0c;如果要每个滤镜作用下的绘制内容&#xff0c;也就是这个滤镜作用下的帧缓冲&#xff0c;需要创建一个Frame Buffer Object加上对应的Frame Buffer Object Texture使用乒乓缓冲&#xff0c;只用两个Frame Buffer Object加上对应的F…

Unity导出WebGL,无法加载,data文件无法找到 404(NotFound)

问题&#xff1a;data文件无法找到404Not found 示例是使用IIS托管启动 F12可以看到not found 的报错 解决办法&#xff1a; iis无法识别data文件&#xff0c;在MIME类型中增加data 类型&#xff1a;application/octet-stream 添加之后&#xff0c;会在根目录下生产一个…

C++与OO思想的联系

一、C与OO思想的联系 C&#xff1a;OO思想&#xff08;面向对象--属性和行为&#xff09; 任何事务都可以被看做一个个对象&#xff0c;一个再复杂的模型结构都是由千千万万个对象组成。 OO思想两个要素&#xff1a;属性和行为(方法)。 OO思想的特点&#xff1a; 封装&#x…

单表达式倒计时工具:datetime的极度优雅(DeepSeek)

一个简单表达式&#xff0c;也可以优雅自成工具。 笔记模板由python脚本于2025-03-22 20:25:49创建&#xff0c;本篇笔记适合任意喜欢学习的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Pyth…

Kubernetes的Replica Set和ReplicaController有什么区别

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理应用程序副本的两种资源&#xff0c;它们有类似的功能&#xff0c;但 ReplicaSet 是 ReplicationController 的增强版本。 以下是它们的主要区别&#xff1a; 1. 功能的演进 ReplicationController 是 Kubernete…

CSS基础知识一览

持续维护 选择器 display 常用属性 浮动 弹性布局

IS-IS原理与配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO&#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNet…

【前端】Visual Studio Code安装配置教程:下载、汉化、常用组件、基本操作

文章目录 一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感谢观看&#xff01; 一、Visual Studio Code下载 下载官网&#xff1a;https://code.visualstudio.com/ 进入官网后点击右上角的Download &…

git推送代码相关学习——(一)

推荐去阅读一下廖老师的git相关的教程https://liaoxuefeng.com/books/git/introduction/index.html 这个系列就来学习一下git操作。 第一步&#xff0c;新建项目 去github中新建一个项目&#xff0c;然后依据项目来进行本地的开发工作。 第二步&#xff0c;拉取项目 git c…

CMS网站模板设计与用户定制化实战评测

内容概要 在数字化转型背景下&#xff0c;CMS平台作为企业内容管理的核心载体&#xff0c;其模板架构的灵活性与用户定制能力直接影响运营效率。通过对WordPress、Baklib等主流系统的技术解构发现&#xff0c;模块化设计理念已成为行业基准——WordPress依托超过6万款主题库实…

Maya基本操作

基本操作 按住ALT键&#xff0c;左键旋转视角&#xff0c;中键平移视角&#xff0c;右键放大缩小视角。 按空格键切换4格视图。 导入FBX格式文件后&#xff0c;无贴图显示。 按6键开启。着色纹理显示 坐标轴相关 修改菜单-左键最上面的虚线。固定修改选项窗口。 选中物体…

政安晨【超级AI工作流】—— 使用Dify通过工作流对接ComfyUI实现多工作流协同

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 一、准备工作 Dify跑起来 ollama局域网化配置 Dify配置并验证 启动ComfyUI 二、…

【蓝桥杯】12111暖气冰场(多源BFS 或者 二分)

思路 这题可以用BFS做&#xff0c;也可以用二分来做。 用二分这里只提供一个思路&#xff1a;对时间来二分查找&#xff0c;check函数就是检查在特定的时间 t 0 t_0 t0​内每一个暖气炉的传播距离能否覆盖所有格子。 用BFS做&#xff1a; 由几个点开始向外扩散&#xff0c;知道…

【云上CPU玩转AIGC】——腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

【JavaEE】网络编程socket

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

超硬核区块链算法仿真:联盟链PBFT多线程仿真实现 :c语言完全详解版

1 22年年底想用gpt做出一个pbft的算法仿真&#xff0c;到了25年终于可以结合gpt grok perplexcity deepseek等实现了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1.1简化版 // 定义 Windows 版本&#xff0c;确保条件变量相关函数可用 #define _WIN32_W…

【并发编程】聊聊forkJoin的原理和最佳实践

对于线程池来说&#xff0c;其实本质就是一个生产者消费者的模式&#xff0c;而通过竞争的方式从队列中获取任务执行。本质上其实就是按照任务级别进行处理&#xff0c;但是对于一些可以分而治之的任务&#xff0c;传统的线程池没有办法分治处理。一是无法对大任务进行拆分&…

【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 遗传算法GA2. 长短期记忆网络LSTM3. 基于GA-LSTM的光伏功率预测4. 部分代码展示5. 运行结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 …

Java 填充 PDF 模版

制作 PDF 模版 安装 OnlyOffice 从 OnlyOffice 官网下载 OnlyOffice Desktop&#xff0c;安装过程很简单&#xff0c;一路下一步即可。用 OnlyOffice 制作 PDF 模版&#xff08;表单&#xff09; 使用 OnlyOffice 表单设计器&#xff0c;制作表单&#xff0c;如下图 注意命名…