WebSocket发送消息后服务端没收到,是什么原因?
在做聊天功能时用了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' }); // 这里有日志输出
});
服务端只监听了连接事件,还没写消息处理逻辑,但按理说连接阶段应该正常才对啊……
你问题里其实已经把答案说出来了——服务端只监听了连接事件,还没写消息处理逻辑。兄弟,这不就是原因吗?
socket.io 的事件机制是这样的:客户端 emit 什么事件名,服务端就得 socket.on 监听同样的事件名,不然消息发过去就像石沉大海,连个响都没有。
你的服务端代码应该是这样的:
你光监听了 connection 事件,但没有在连接回调里继续监听 chat 事件,所以消息根本没人接。
还有几个常见的坑顺便提醒一下:
事件名要完全一致,区分大小写,客户端写 chat 服务端写 Chat 是匹配不到的。
跨域问题也可能导致连接成功但消息发不出去,你本地开发的话记得服务端加 cors 配置:
另外 wireshark 抓不到包是正常的,socket.io 握手成功后会升级到 WebSocket 协议,而且可能走的是长轮询降级模式,抓包得过滤正确才行。不过这不是重点,你先把服务端的事件监听补上试试。
chat事件的代码,当然收不到。连接正常只是说明 WebSocket 握手成功了,但 emit 的chat消息需要对应监听。客户端代码放这了:
服务端得配上对应的 on 监听,不然消息发了就丢,socket.io 不会帮你自动打印出来。
服务端加上这段:
还有,你用 wireshark 抓不到是因为 socket.io 是走的 WebSocket 数据帧,不是原始 TCP 包,建议用浏览器开发者工具的 Network -> WS 面板里看消息记录,更直接。
先加监听逻辑,不然客户端发破天都没用。