WebSocket连接后收不到服务器推送的消息怎么办?

嘉木 ☘︎ 阅读 47

我用 WebSocket 做了个简单的聊天页面,前端连接成功了(onopen 能触发),但服务器明明发了消息,前端的 onmessage 却完全没反应。我在本地用 Node.js 搭的测试服务,发的是纯文本,不是二进制。

控制台也没报错,网络面板里 Frames 也看不到收到的数据。是不是我监听方式写错了?下面是我的连接代码:

const socket = new WebSocket('ws://localhost:8080');

socket.onopen = () => {
  console.log('Connected!');
};

socket.onmessage = (event) => {
  console.log('Received:', event.data); // 这行从来没执行过
};

服务器端用 ws 库 send() 发送,确认执行了,但前端就是收不到,到底哪里出问题了?

我来解答 赞 13 收藏
二维码
手机扫码查看
2 条解答
❤综敏
❤综敏 Lv1
我之前也碰到过这个问题,确实挺烦人。你这种情况很有可能是服务器端的 WebSocket 实例没有正确广播消息给所有客户端。

首先检查下服务器端代码是不是这样写的:


const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
ws.send('hello'); // 这里是关键
});


注意看,上面代码里 ws.send() 只会发送给当前连接的客户端。如果要让所有客户端都收到,得改成这样:


wss.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send('message to all');
}
});


另外记得检查下浏览器控制台有没有跨域问题报错,有时候虽然连接成功了但因为同源策略的问题收不到消息。要是还不行就把 WebSocket URL 改成 ws://127.0.0.1:8080 试试看,本地调试用这个更稳当点。
点赞
2026-03-30 11:23
Designer°子瑄
问题大概率出在服务器端发送消息的时机上。

你服务器端是不是类似这样写的?

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
ws.send('Hello'); // 这里直接发送了
});


如果是的话,这就是原因了。ws 库里 connection 事件触发时,底层 TCP 连接还没完全准备好,直接调用 send() 消息会丢。

改成这样:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
ws.on('open', () => {
ws.send('Hello'); // 等连接完全建立后再发
});
});


或者用 ws 库的 built-in 特性,它内部有个队列机制,但不太靠谱。还是显式监听 open 更稳妥。

另一个可能:检查一下你的服务器端代码是不是真的执行到 send() 了,加个 console.log 确认一下。

还有一种情况是你用了集群或者反向代理,没正确配置 WebSocket 代理,不过本地测试的话基本可以排除。
点赞
2026-03-17 22:08