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

WHAT - 学习 WebSocket 实时 Web 开发

文章目录

  • 一、基础知识了解
    • 1. WebSocket 是什么?
    • 2. 它的优势:
  • 二、基本工作流程
  • 三、快速体验:使用原生 WebSocket
    • 客户端(浏览器端 JS):
    • 服务端(Node.js 示例,使用 ws 库)
  • 四、深入学习建议
  • 五、常见问题
  • 六、进阶推荐
  • 七、学习资料推荐

学习 WebSocket 是掌握实时 Web 开发的重要一步。下面是一个从 0 到 1 学习 WebSocket 的路线图,帮助你系统性入门:


一、基础知识了解

1. WebSocket 是什么?

  • WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。
  • 相比 HTTP,WebSocket 不需要反复建立连接,适合实时性强的场景,比如:聊天室、在线游戏、实时通知等。

2. 它的优势:

  • 持久连接(只建立一次 TCP 连接)
  • 双向通信(服务器可以主动推送消息)
  • 低延迟、低开销

二、基本工作流程

  1. 客户端发起连接请求
    浏览器发起 WebSocket 握手请求。
  2. 服务器响应
    如果服务器支持,会返回 101 状态码,表示协议切换成功。
  3. 双向通信开始
    双方可以互发消息。
  4. 关闭连接
    一方发起关闭,另一方确认,连接结束。

三、快速体验:使用原生 WebSocket

客户端(浏览器端 JS):

const socket = new WebSocket('ws://localhost:3000');socket.onopen = () => {console.log('连接已建立');socket.send('你好,服务器');
};socket.onmessage = (event) => {console.log('收到消息:', event.data);
};socket.onclose = () => {console.log('连接已关闭');
};socket.onerror = (error) => {console.error('发生错误:', error);
};

服务端(Node.js 示例,使用 ws 库)

npm install ws
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });wss.on('connection', (ws) => {console.log('客户端已连接');ws.on('message', (message) => {console.log('收到消息:', message);ws.send(`你说的是:${message}`);});ws.on('close', () => {console.log('客户端已断开');});
});

四、深入学习建议

内容学习重点
WebSocket 协议握手过程、协议头、状态码
安全性wss:// 加密连接,身份验证、心跳保活机制
高级应用聊天系统、实时协作、在线游戏
与 HTTP 的关系了解 HTTP 和 WebSocket 如何配合使用
框架集成使用 Socket.IO(封装更高级功能)或在 React/Vue 中使用 WebSocket hooks

五、常见问题

  • 如何做断线重连?
  • 如何心跳保活?
  • 如何做消息可靠传输?
  • 如何做多用户/房间管理?

六、进阶推荐

  • Socket.IO(Node.js):封装了 WebSocket 和长轮询,使用简单功能强大。
  • NestJS + WebSocket Gateway:适合在企业级 Node 应用中集成。
  • 前端封装 WebSocket hook:如 useWebSocket Hook 在 React 项目中使用。

七、学习资料推荐

  1. MDN WebSocket 文档
  2. ws 官方文档
  3. Socket.IO 官网
  4. B站搜索:WebSocket 实时聊天室项目
http://www.xdnf.cn/news/9354.html

相关文章:

  • SQL中的锁机制
  • LabVIEW 中不同 VI 间图像传递方法解析
  • 数据结构-排序(1)
  • 基于seal密码库的格加密算法的原理、实现与应用
  • 6个月Python学习计划 Day 7 - 复盘 + 测试日
  • 压缩包方式在Linux和Windows下安装mongodb
  • zynq7020 shm共享内存和OCM
  • Rust 和 Python 如何混合使用
  • 面试题——计算机网络:HTTP和HTTPS的区别?
  • MySQL问题:MVCC是什么?
  • 从解决一个分享图片生成的历史bug出发,详解LayoutInflater和View.post的工作原理
  • java 递归地复制文件夹及其所有子文件夹和文件
  • LeetCode-栈-每日温度
  • 《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡
  • 界面控件DevExpress WinForms v24.2新版亮点:富文本编辑器功能全新升级
  • Java五种方法批量处理List元素全解
  • 【操作系统】内核态、用户态
  • [Python] 避免 PyPDF2 写入 PDF 出现黑框问题:基于语言自动匹配系统字体的解决方案
  • CS144 - LAB0
  • 文本编辑器vi的使用
  • SECS/GEM协议中Report ID、SV ID、CE ID与S2F33/S2F35/S2F37指令的关系及配置示例
  • 专业库室联管联控系统|门禁联管联控系统
  • Browser-use快速了解
  • 流光溢彩的数字长河:Linux基础IO,文件系统的诗意漫游
  • Google Play的最新安全变更可能会让一些高级用户无法使用App
  • 函数抓取图片microsoft excel与wps的区别
  • 【n-grams】基于统计方法的语言模型
  • 深入理解设计模式之中介者模式
  • 基于Springboot + vue3实现的图书管理系统
  • 【Mysql开启慢查询日志】