WebSocket发送消息后服务端没收到,是什么原因?

上官艳鑫 阅读 30

在做聊天功能时用了socket.io,客户端用socket.emit('chat', message)发送消息后,服务端监听不到。服务端明明显示连接正常,但就是收不到消息,卡在这好几天了……

尝试过在客户端加日志发现emit确实触发了,服务端用wireshark抓包也没看到数据。检查过端口是通的,握手阶段也没报错。这是哪里配置错了?

客户端代码片段:


const socket = io('http://localhost:3000');
document.querySelector('button').addEventListener('click', () => {
  socket.emit('chat', { text: 'test message' }); // 这里有日志输出
});

服务端只监听了连接事件,还没写消息处理逻辑,但按理说连接阶段应该正常才对啊……

我来解答 赞 7 收藏
二维码
手机扫码查看
1 条解答
书生シ瑞珺
你服务端根本没写监听 chat 事件的代码,当然收不到。连接正常只是说明 WebSocket 握手成功了,但 emit 的 chat 消息需要对应监听。

客户端代码放这了:

const socket = io('http://localhost:3000');
document.querySelector('button').addEventListener('click', () => {
socket.emit('chat', { text: 'test message' });
});


服务端得配上对应的 on 监听,不然消息发了就丢,socket.io 不会帮你自动打印出来。

服务端加上这段:

const io = require('socket.io')(3000);

io.on('connection', (socket) => {
console.log('用户连接上了');

// 关键:必须手动监听 chat 事件
socket.on('chat', (data) => {
console.log('收到消息:', data);
});
});


还有,你用 wireshark 抓不到是因为 socket.io 是走的 WebSocket 数据帧,不是原始 TCP 包,建议用浏览器开发者工具的 Network -> WS 面板里看消息记录,更直接。

先加监听逻辑,不然客户端发破天都没用。
点赞 3
2026-02-11 03:00