news 2026/5/11 7:11:16

WebSocket实战:让网页“活”起来!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WebSocket实战:让网页“活”起来!

❤ 写在前面
如果觉得对你有帮助的话,点个小❤❤ 吧,你的支持是对我最大的鼓励~
个人独立开发wx小程序,感谢支持!


你是否曾经在网页聊天室中看到消息瞬间出现,或者在股票网站上看到股价实时跳动,却不知道背后是如何实现的?今天,我们就来揭开实时通信的神秘面纱!

🤔 为什么需要WebSocket?

想象一下这个场景:你想通过网页和朋友实时聊天。

传统方法:不断敲门问“有新消息吗?”

传统HTTP通信就像这样:

你:有新消息吗? 服务器:没有(1秒后) 你:有新消息吗? 服务器:没有(1秒后) 你:有新消息吗? 服务器:有!消息是“你好!”

这种方法效率低下,浪费资源,而且有延迟!

1. 请求: 有新消息吗?
2. 响应: 没有
3. 等待1秒
4. 请求: 有新消息吗?
5. 响应: 消息: '你好!'

客户端

服务器

🚀 WebSocket:直接装个对讲机!

WebSocket就像在客户端和服务器之间安装了一部对讲机:

  1. 初次握手:客户端说“我想建立WebSocket连接”
  2. 连接建立:服务器回答“好的,连接已建立”
  3. 自由通话:双方可以随时互相发送消息
1. HTTP握手请求
2. 握手响应
3. WebSocket连接建立
4. 实时双向通信
5. 实时双向通信

客户端

服务器

💻 手把手实战:创建简单聊天室

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

// server.jsconstWebSocket=require('ws');// 创建WebSocket服务器,监听8080端口constwss=newWebSocket.Server({port:8080});console.log('WebSocket服务器已启动,端口8080');// 当有客户端连接时wss.on('connection',(ws)=>{console.log('新客户端已连接');// 向客户端发送欢迎消息ws.send('欢迎来到聊天室!');// 监听客户端发来的消息ws.on('message',(message)=>{console.log('收到消息:',message.toString());// 广播消息给所有客户端wss.clients.forEach((client)=>{if(client.readyState===WebSocket.OPEN){client.send(`用户说:${message}`);}});});// 客户端断开连接时ws.on('close',()=>{console.log('客户端已断开连接');});});

2. 客户端(HTML + JavaScript)

<!-- index.html --><!DOCTYPEhtml><html><head><title>WebSocket聊天室</title><style>body{font-family:Arial,sans-serif;max-width:600px;margin:0 auto;padding:20px;}#messages{border:1px solid #ccc;height:300px;overflow-y:auto;padding:10px;margin-bottom:10px;border-radius:5px;}.message{margin:5px 0;padding:8px;background-color:#f0f0f0;border-radius:4px;}.message.system{background-color:#e3f2fd;color:#1565c0;}input, button{padding:10px;font-size:16px;}button{background-color:#4CAF50;color:white;border:none;cursor:pointer;}button:hover{background-color:#45a049;}</style></head><body><h1>✨ 简易聊天室 ✨</h1><divid="messages"></div><div><inputtype="text"id="messageInput"placeholder="输入消息..."style="width:70%;"><buttononclick="sendMessage()"style="width:25%;">发送</button></div><pid="status">正在连接服务器...</p><script>// 创建WebSocket连接constsocket=newWebSocket('ws://localhost:8080');// 连接建立时socket.onopen=()=>{document.getElementById('status').innerHTML='✅ 已连接到聊天室!';addMessage('系统','你已进入聊天室',true);};// 收到消息时socket.onmessage=(event)=>{addMessage('系统',event.data,true);};// 连接关闭时socket.onclose=()=>{document.getElementById('status').innerHTML='❌ 连接已断开';};// 发送消息函数functionsendMessage(){constinput=document.getElementById('messageInput');constmessage=input.value.trim();if(message&&socket.readyState===WebSocket.OPEN){socket.send(message);addMessage('我',message,false);input.value='';input.focus();}}// 添加消息到聊天窗口functionaddMessage(sender,text,isSystem){constmessagesDiv=document.getElementById('messages');constmessageDiv=document.createElement('div');messageDiv.className=`message${isSystem?'system':''}`;messageDiv.innerHTML=`<strong>${sender}:</strong>${text}`;messagesDiv.appendChild(messageDiv);messagesDiv.scrollTop=messagesDiv.scrollHeight;}// 按Enter键发送消息document.getElementById('messageInput').addEventListener('keypress',(e)=>{if(e.key==='Enter'){sendMessage();}});</script></body></html>

🎯 运行步骤

  1. 安装依赖
npminstallws
  1. 启动服务器
nodeserver.js
  1. 打开客户端
    双击index.html或用本地服务器打开

  2. 测试聊天
    打开多个浏览器窗口,互相发送消息!

🌟 WebSocket的优势总结

特性HTTP轮询WebSocket
连接方式每次请求新建连接一次连接,长期使用
实时性有延迟(依赖轮询间隔)真正实时
资源消耗高(频繁建立连接)低(一个连接搞定)
数据传输只能客户端主动请求双向主动推送
头部开销每次都有完整HTTP头部建立后只有少量数据头

🚀 实际应用场景

  1. 实时聊天应用:微信网页版、Slack
  2. 在线协作工具:Google Docs实时协作
  3. 股票交易平台:实时股价更新
  4. 多人在线游戏:实时位置同步
  5. IoT物联网:设备状态实时监控
  6. 实时通知:新邮件、新消息提醒

🛠️ 进阶技巧

1. 断线重连

letreconnectInterval=1000;// 1秒后重试letmaxReconnectInterval=30000;// 最大30秒functionconnect(){constsocket=newWebSocket('ws://localhost:8080');socket.onclose=()=>{setTimeout(()=>{reconnectInterval=Math.min(reconnectInterval*1.5,maxReconnectInterval);connect();// 重新连接},reconnectInterval);};}

2. 心跳检测

// 定期发送心跳包,保持连接活跃setInterval(()=>{if(socket.readyState===WebSocket.OPEN){socket.send(JSON.stringify({type:'heartbeat'}));}},30000);// 每30秒一次

3. 消息格式标准化

// 使用JSON格式的消息constmessage={type:'chat',// 消息类型:chat、join、leave等user:'小明',content:'大家好!',timestamp:Date.now()};socket.send(JSON.stringify(message));

📚 学习资源推荐

  1. MDN WebSocket文档:最权威的参考资料
  2. Socket.IO:功能更丰富的实时通信库
  3. ws库文档:Node.js WebSocket服务器库
  4. WebSocket RFC:深入理解协议细节

💡 小结

WebSocket让网页从被动的“问-答”模式变成了主动的“对话”模式,为实时Web应用打开了大门。虽然本文只是入门介绍,但已经涵盖了WebSocket的核心概念和基本用法。

记住这个简单的比喻

  • HTTP轮询:像不断打电话问“到了吗?到了吗?”
  • WebSocket:像打开视频通话,随时能看到对方

现在,你已经掌握了让网页“活”起来的关键技术!快去创建你自己的实时应用吧,无论是聊天室、实时仪表盘还是在线游戏,WebSocket都能让你的应用体验更上一层楼!

有什么问题或想了解更多?欢迎在评论区交流! 🎉

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 16:39:32

Windows注册表修复Keil5中文乱码的解决完整示例

一招根治Keil5中文乱码&#xff1a;注册表级编码修复实战指南你有没有遇到过这种情况&#xff1f;打开一个带中文注释的STM32工程&#xff0c;结果Keil5里满屏方框、问号甚至“锟斤拷”——代码根本没法读。重装软件没用&#xff0c;换字体无效&#xff0c;转UTF-8还可能引发编…

作者头像 李华
网站建设 2026/5/8 21:28:31

AI演示文稿终极指南:快速打造专业级智能PPT

AI演示文稿终极指南&#xff1a;快速打造专业级智能PPT 【免费下载链接】AiPPT AI 智能生成 PPT&#xff0c;通过主题/文件/网址等方式生成PPT&#xff0c;支持原生图表、动画、3D特效等复杂PPT的解析和渲染&#xff0c;支持用户自定义模板&#xff0c;支持智能添加动画&#x…

作者头像 李华
网站建设 2026/5/9 0:34:14

WeTTY终极指南:在浏览器中开启专业级终端体验

想要随时随地访问服务器终端&#xff1f;厌倦了繁琐的SSH客户端配置&#xff1f;WeTTY为您带来了革命性的解决方案——将完整的终端功能直接嵌入浏览器&#xff0c;让您在任何设备上都能享受本地终端般的流畅体验。&#x1f680; 【免费下载链接】wetty 项目地址: https://g…

作者头像 李华
网站建设 2026/5/8 16:05:49

PaddlePaddle镜像支持多任务并行训练,提高GPU吞吐率

PaddlePaddle镜像支持多任务并行训练&#xff0c;提升GPU吞吐率 在AI研发日益工业化的今天&#xff0c;一个现实问题困扰着许多团队&#xff1a;明明配备了8卡A100服务器&#xff0c;可实际训练时GPU利用率却常常徘徊在40%~60%&#xff0c;其余时间都在“空转”。数据加载慢、日…

作者头像 李华
网站建设 2026/4/27 22:31:08

Jupyter中运行C语言的终极指南:从零开始的完整教程

Jupyter中运行C语言的终极指南&#xff1a;从零开始的完整教程 【免费下载链接】jupyter-c-kernel Minimal Jupyter C kernel 项目地址: https://gitcode.com/gh_mirrors/ju/jupyter-c-kernel 你是否曾经希望在Jupyter Notebook中直接运行C语言代码&#xff1f;现在这个…

作者头像 李华
网站建设 2026/5/3 12:43:50

CD38抗体:如何通过多机制协同作用重塑血液肿瘤治疗格局?

一、CD38分子的结构与功能特性如何&#xff1f;CD38是一种分子量为46kDa的II型跨膜糖蛋白&#xff0c;其结构特征包括N端胞质短尾、单次跨膜结构域和C端较长的胞外区域。作为一种双功能胞外酶&#xff0c;CD38同时具备环化酶和水解酶活性&#xff0c;在核苷酸代谢中发挥核心作用…

作者头像 李华