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

React+Socket.io消息无法广播至所有连接设备,请求排查错误

问题:Socket.IO无法广播消息到所有连接客户端

使用React和Socket.IO开发消息广播功能时,当前仅发起请求的客户端能接收消息,其他已连接设备无法收到。相关代码如下:

App.js

import { useRef } from "react";
import { io } from "socket.io-client";
const socket = io("http://localhost:4000");

const App = () => {
  const messege = useRef(null);
  //socket functions
  socket.on("connect", () => {
    console.log("connected: " + socket.id);
  });
  socket.on("recieve", (msg) => {
    console.log(msg);
  });

  const send = () => {
    const message = messege.current.value;
    socket.emit("message", message);
  };

  return (
    <div>
      <input type="text" placeholder="Message" ref={messege} />
      <button onClick={send}>Send</button>
    </div>
  );
};

export default App;

Server.js

const { Server } = require("socket.io");

const io = new Server(4000, {
  cors: {
    origin: ["http://localhost:5173"],
  },
});

io.on("connection", (socket) => {
  console.log(`connected with id: ${socket.id}`);
  socket.on("message", (msg) => {
    console.log(msg);
    socket.emit("recieve", msg);
  });
});

错误原因

服务器端处理message事件时,使用了socket.emit("recieve", msg)——这个方法只会将消息发送回当前触发事件的客户端(也就是发消息的那个客户端),并不会广播给其他已连接的客户端。

解决方案

根据需求选择以下两种广播方式之一:

  • 如果需要给除发件人之外的所有客户端发消息:使用socket.broadcast.emit()
  • 如果需要给包括发件人在内的所有客户端发消息:使用io.emit()

修正后的Server.js代码

const { Server } = require("socket.io");

const io = new Server(4000, {
  cors: {
    origin: ["http://localhost:5173"],
  },
});

io.on("connection", (socket) => {
  console.log(`connected with id: ${socket.id}`);
  socket.on("message", (msg) => {
    console.log(msg);
    // 方式1:广播给除发件人外的所有客户端
    // socket.broadcast.emit("recieve", msg);
    
    // 方式2:广播给所有客户端(包括发件人)
    io.emit("recieve", msg);
  });
});

内容的提问来源于stack exchange,提问作者shark_feeder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:06