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

上官艳鑫 阅读 53

在做聊天功能时用了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' }); // 这里有日志输出
});

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

我来解答 赞 14 收藏
二维码
手机扫码查看
2 条解答
玉曼(打工版)
哈哈,这个问题我当年踩过坑,血泪教训啊。

你问题里其实已经把答案说出来了——服务端只监听了连接事件,还没写消息处理逻辑。兄弟,这不就是原因吗?

socket.io 的事件机制是这样的:客户端 emit 什么事件名,服务端就得 socket.on 监听同样的事件名,不然消息发过去就像石沉大海,连个响都没有。

你的服务端代码应该是这样的:

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

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

// 这一行你没写!
socket.on('chat', (data) => {
console.log('收到消息:', data);
});
});


你光监听了 connection 事件,但没有在连接回调里继续监听 chat 事件,所以消息根本没人接。

还有几个常见的坑顺便提醒一下:

事件名要完全一致,区分大小写,客户端写 chat 服务端写 Chat 是匹配不到的。

跨域问题也可能导致连接成功但消息发不出去,你本地开发的话记得服务端加 cors 配置:

const io = require('socket.io')(3000, {
cors: {
origin: '*',
methods: ['GET', 'POST']
}
});


另外 wireshark 抓不到包是正常的,socket.io 握手成功后会升级到 WebSocket 协议,而且可能走的是长轮询降级模式,抓包得过滤正确才行。不过这不是重点,你先把服务端的事件监听补上试试。
点赞 5
2026-03-02 06:01
书生シ瑞珺
你服务端根本没写监听 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 面板里看消息记录,更直接。

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