
做后台管理系统、即时通讯、消息通知、在线直播、日志监控类项目实时消息推送是必不可少的核心功能。很多新手实现实时更新习惯性用定时器轮询接口虽然能实现效果但弊端非常明显。定时器每隔几秒请求一次接口会造成大量无效HTTP请求占用服务器带宽低并发还好一旦用户量上来服务器压力剧增而且消息推送存在延迟无法做到即时同步。而WebSocket的出现完美解决了这个问题。它是HTML5原生的双向通信协议浏览器和服务器只需一次握手建立长连接后续可以持续双向推送数据无需重复请求低延迟、高性能是目前网页实时通信的最优方案。今天我结合真实项目实战从零带大家用原生 JS 实现网页实时消息推送功能包含完整前端代码、状态监听、异常重连、业务适配零基础也能直接上手复用。一、简单搞懂为什么要用WebSocket我们日常的 HTTP 请求是单次单向的一次请求一次响应连接立即断开服务器无法主动给浏览器推送数据。而 WebSocket 是持久双向长连接握手成功后连接持续保持浏览器可以发消息给服务端服务端也能主动推送消息给浏览器完美适配实时通知场景。相比于轮询优势非常突出1、开销极低一次握手、长期通信无频繁请求开销2、延迟极低服务端数据更新立即推送无轮询等待延迟3、双向通信支持客户端、服务端互相发送数据4、原生支持浏览器内置API无需引入任何第三方插件。二、WebSocket核心四大事件必掌握原生 WebSocket 开发核心就四个事件所有推送逻辑都围绕它们展开记住就能搞定90%的业务场景onopen连接成功触发onmessage接收服务端推送消息触发核心onerror连接异常、报错触发onclose连接关闭、断开触发。三、前端完整实战代码可直接对接后端下面给大家一套生产可用的完整版代码包含页面展示、连接初始化、消息接收、消息发送、异常监听、断开重连逻辑无需改造直接用于消息通知、实时公告、在线消息推送场景。html!DOCTYPE htmlhtml langzh-CNheadmeta charsetUTF-8titleWebSocket实时消息推送/titlestyle.msg-box { width: 600px; height: 400px; border: 1px solid #eee; padding: 10px; overflow-y: auto; margin-bottom: 10px; }.item { padding: 6px 0; border-bottom: 1px solid #f5f5f5; }.system { color: #999; }.server { color: #1989fa; }/style/headbodydiv classmsg-box idmsgBox/divinput typetext idinput placeholder输入消息button onclicksendMsg()发送消息/buttonscriptlet socket null;// 后端ws地址本地测试/线上部署替换即可const wsUrl ws://localhost:8080/ws;// 初始化WebSocket连接function initWebSocket() {socket new WebSocket(wsUrl);// 1.连接成功回调socket.onopen function() {console.log(WebSocket连接成功);addMsg(系统, 长连接已建立可接收实时推送, system);};// 2.接收服务端推送的实时消息socket.onmessage function(e) {console.log(收到服务端推送消息, e.data);addMsg(服务端, e.data, server);};// 3.连接异常socket.onerror function() {console.error(WebSocket连接异常);addMsg(系统, 连接异常正在重试..., system);};// 4.连接关闭自动重连socket.onclose function() {console.log(WebSocket连接断开);// 延迟3秒重连避免频繁重试setTimeout(initWebSocket, 3000);};}// 发送消息到服务端function sendMsg() {const val document.getElementById(input).value.trim();if(!val) return;// 连接正常才允许发送if(socket socket.readyState 1) {socket.send(val);document.getElementById(input).value ;}}// 页面渲染消息function addMsg(from, content, type) {const box document.getElementById(msgBox);const div document.createElement(div);div.className item ${type};div.innerText 【${from}】${content};box.appendChild(div);// 滚动到底部box.scrollTop box.scrollHeight;}// 页面加载初始化window.onload initWebSocket;/script/body/html四、核心状态码说明排坑关键很多人遇到连接失败不知道怎么排查其实可以通过readyState状态码判断连接情况开发调试非常好用0正在连接中1连接成功正常通信2正在关闭连接3连接已关闭。我们发送消息前判断状态为1能有效避免连接断开导致的发送失败报错。五、线上开发高频踩坑总结我在多个项目落地过程中总结了几个新手最容易踩的坑提前规避能少走很多弯路1、忽略断线重连网络波动、页面休眠都会导致连接断开不加自动重连用户刷新前彻底收不到推送本文代码已内置自动重连机制。2、未判断连接状态直接send连接未建立或断开时调用send会直接控制台报错必须校验readyState。3、http与ws、https与wss混用http项目用ws协议https加密站点必须用wss加密协议否则浏览器直接拦截连接。4、页面销毁未关闭连接路由切换、页面关闭时建议手动close防止后台大量无效长连接堆积。六、业务场景适配范围这套原生 WebSocket 方案足够轻量化适配绝大多数中小型实时业务1、后台系统实时消息通知、审批推送、日志更新2、在线简单聊天室、实时弹幕、在线互动3、设备监控、数据大屏实时刷新4、订单状态实时变更、支付结果即时推送。如果是超大型高并发即时通讯项目可以在此基础上结合心跳检测、断线重连、消息补发进一步优化。七、WebSocket和轮询怎么选很多人纠结业务选型这里给大家一个简单标准低频、非实时场景简单定时器轮询足够开发成本最低高频、高实时性、持续更新场景优先 WebSocket 长连接节省服务器资源、体验更好。写在最后WebSocket 是前端进阶必备的实时通信技术相比于传统轮询性能和体验都是质的提升。而且原生 API 简洁易懂不需要复杂学习成本只要掌握四大事件和状态监听就能独立完成所有实时推送需求。本文这套带重连、带页面展示、异常兜底的完整代码可以直接复制到项目中使用彻底告别低效轮询轻松实现网页毫秒级实时消息推送满足日常开发和面试需求。