You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何不同客户端无法通过Express.js/Socket.IO服务器通信?

问题诊断与解决方案

问题出在服务器端的消息发送逻辑上:你使用的socket.emit('aabc', data)只会把消息发送给触发newMessage事件的当前客户端,所以只有发消息的用户自己能收到,其他连接的客户端自然收不到。

两种修复方案

方案1:给所有在线客户端发消息(含发送者)

如果需要让所有连接到服务器的客户端都收到这条消息,把socket.emit替换成io.emit:

io.on('connection', (socket) => {
    console.log("An user has joined!")

    socket.on("newMessage", (data) => {
        console.log("the message: " +  data)
        // io.emit 会给所有已连接的客户端推送消息
        io.emit('aabc', data)
        console.log("a message has been sent to all clients.")
    });
});

方案2:给除发送者外的其他客户端发消息

如果不想让发送者重复收到自己发的消息,使用socket.broadcast.emit:

io.on('connection', (socket) => {
    console.log("An user has joined!")

    socket.on("newMessage", (data) => {
        console.log("the message: " +  data)
        // broadcast.emit 仅向当前客户端以外的其他在线用户推送消息
        socket.broadcast.emit('aabc', data)
        // 如果还要给发送者自己发,可额外加一句 socket.emit('aabc', data)
        console.log("a message has been sent to other clients.")
    });
});

客户端优化建议

你的React客户端每次组件挂载都会创建新的Socket连接,建议在组件卸载时断开连接,避免无效连接堆积:

useEffect(() => {
    const socket = io('http://localhost:1234/');
  
    socket.on('aabc', (data: any) => {
        console.log("This is the message: " + data)
    });

    // 组件卸载时断开Socket连接
    return () => socket.disconnect();
}, []);

内容的提问来源于stack exchange,提问作者Taylor F.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:52:57