WebSocket实战,JS 实现网页实时消息推送功能
2026/8/27 10:05:27 网站建设 项目流程

做后台管理系统、即时通讯、消息通知、在线直播、日志监控类项目,实时消息推送是必不可少的核心功能。很多新手实现实时更新,习惯性用定时器轮询接口,虽然能实现效果,但弊端非常明显。

定时器每隔几秒请求一次接口,会造成大量无效HTTP请求,占用服务器带宽,低并发还好,一旦用户量上来,服务器压力剧增,而且消息推送存在延迟,无法做到即时同步。

WebSocket的出现完美解决了这个问题。它是HTML5原生的双向通信协议,浏览器和服务器只需一次握手建立长连接,后续可以持续双向推送数据,无需重复请求,低延迟、高性能,是目前网页实时通信的最优方案。

今天我结合真实项目实战,从零带大家用原生 JS 实现网页实时消息推送功能,包含完整前端代码、状态监听、异常重连、业务适配,零基础也能直接上手复用。

一、简单搞懂:为什么要用WebSocket

我们日常的 HTTP 请求是单次单向的,一次请求一次响应,连接立即断开,服务器无法主动给浏览器推送数据。

而 WebSocket 是持久双向长连接,握手成功后连接持续保持,浏览器可以发消息给服务端,服务端也能主动推送消息给浏览器,完美适配实时通知场景。相比于轮询,优势非常突出:

1、开销极低:一次握手、长期通信,无频繁请求开销;

2、延迟极低:服务端数据更新立即推送,无轮询等待延迟;

3、双向通信:支持客户端、服务端互相发送数据;

4、原生支持:浏览器内置API,无需引入任何第三方插件。

二、WebSocket核心四大事件(必掌握)

原生 WebSocket 开发,核心就四个事件,所有推送逻辑都围绕它们展开,记住就能搞定90%的业务场景:

onopen:连接成功触发;

onmessage:接收服务端推送消息触发(核心);

onerror:连接异常、报错触发;

onclose:连接关闭、断开触发。

三、前端完整实战代码(可直接对接后端)

下面给大家一套生产可用的完整版代码,包含页面展示、连接初始化、消息接收、消息发送、异常监听、断开重连逻辑,无需改造直接用于消息通知、实时公告、在线消息推送场景。

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>WebSocket
实时消息推送</title>
<style>
.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>
</head>
<body>
<div class="msg-box" id="msgBox"></div>
<input type="text" id="input" placeholder="输入消息">
<button onclick="sendMsg()">发送消息</button>

<script>
let 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。

3httpwshttpswss混用:http项目用ws协议,https加密站点必须用wss加密协议,否则浏览器直接拦截连接。

4、页面销毁未关闭连接:路由切换、页面关闭时建议手动close,防止后台大量无效长连接堆积。

六、业务场景适配范围

这套原生 WebSocket 方案足够轻量化,适配绝大多数中小型实时业务:

1、后台系统实时消息通知、审批推送、日志更新;

2、在线简单聊天室、实时弹幕、在线互动;

3、设备监控、数据大屏实时刷新;

4、订单状态实时变更、支付结果即时推送。

如果是超大型高并发即时通讯项目,可以在此基础上结合心跳检测、断线重连、消息补发进一步优化。

七、WebSocket和轮询怎么选?

很多人纠结业务选型,这里给大家一个简单标准:

低频、非实时场景:简单定时器轮询足够,开发成本最低;

高频、高实时性、持续更新场景:优先 WebSocket 长连接,节省服务器资源、体验更好。

写在最后

WebSocket 是前端进阶必备的实时通信技术,相比于传统轮询,性能和体验都是质的提升。而且原生 API 简洁易懂,不需要复杂学习成本,只要掌握四大事件和状态监听,就能独立完成所有实时推送需求。

本文这套带重连、带页面展示、异常兜底的完整代码,可以直接复制到项目中使用,彻底告别低效轮询,轻松实现网页毫秒级实时消息推送,满足日常开发和面试需求。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询