WebSocket连接后收不到服务器推送的消息怎么办?
我用 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() 发送,确认执行了,但前端就是收不到,到底哪里出问题了?
首先检查下服务器端代码是不是这样写的:
注意看,上面代码里
ws.send()只会发送给当前连接的客户端。如果要让所有客户端都收到,得改成这样:另外记得检查下浏览器控制台有没有跨域问题报错,有时候虽然连接成功了但因为同源策略的问题收不到消息。要是还不行就把 WebSocket URL 改成
ws://127.0.0.1:8080试试看,本地调试用这个更稳当点。你服务器端是不是类似这样写的?
如果是的话,这就是原因了。ws 库里 connection 事件触发时,底层 TCP 连接还没完全准备好,直接调用 send() 消息会丢。
改成这样:
或者用 ws 库的 built-in 特性,它内部有个队列机制,但不太靠谱。还是显式监听 open 更稳妥。
另一个可能:检查一下你的服务器端代码是不是真的执行到 send() 了,加个 console.log 确认一下。
还有一种情况是你用了集群或者反向代理,没正确配置 WebSocket 代理,不过本地测试的话基本可以排除。