Socket.emit 不会为所有客户端触发

Socket.emit doesn't trigger for all clients

我刚开始使用 socket.io 做出反应,我被困在前端永久检索数据上。我想做的是创建一个小游戏,第一步是创建一个可供多个用户加入的大厅页面。


这是我遇到问题的部分,例如,如果我用用户 Test

创建游戏

大厅现在只有用户测试

选项卡 1:

| --- 测试 --- |

但是如果我打开一个新标签并加入用户 Test1 的当前标签,我的新标签是

选项卡 2:

| --- 测试测试 1 --- |

我遇到的问题是第一个标签只有第一个加入游戏的用户

选项卡 1:

| --- 测试 --- |

此选项卡未触发事件。下一个选项卡等也会发生相同的情况。

Node.js代码


socket.on("getUsers", async (data) => {
  if (!data.gameCode) {
    universalError("GameCode doesn't exist");
    return;
  }

  const existentGame = await pubClient.get(data.gameCode);

  if (!existentGame) {
    universalError("The Current Game Does Not Exist");
    return;
  }

  currentGame = JSON.parse(existentGame);
  socket.emit("gameUsers", {
    gameUsers: currentGame,
  });
});

反应代码

const equals = (a, b) => JSON.stringify(a) === JSON.stringify(b); 

function() {
  const socket = useContext(SocketContext);
  const [host, setHost] = useState("");
  const [users, setUsers] = useState([]);

  useEffect(() => {
    if (!currentGameCode) return;

    socket.emit("getUsers", { gameCode: currentGameCode });
  }, []);

  socket.on("gameUsers", (data) => {
    setHost(data.gameUsers.host);

    console.log(users, data.gameUsers.users);

    if (!equals(users, data.gameUsers.users)) {
      setUsers(data.gameUsers.users);
    }
  });

  return(
  ...
  )
}

我尝试将 socket.on 放在 useEffect 函数之前,还将 socket.on 插入具有多个依赖项的 useEffect 中,但我没有成功。据我所见,用户在每个选项卡中只输入一次 socket.on("gameUsers"),那是他加入游戏的时候。每次新用户加入游戏时都会调用后端,但是在这种情况下,我的 socket.on 不会触发。对我做错了什么有什么想法吗?期待感谢!

好的,我明白了,问题不在客户端,而是在服务器端。所以我编辑了来自

的标题

Socket.io 不会触发之前选项卡的事件 - React

Socket.emit 不会触发所有客户端


我试图只向触发事件的特定套接字发出事件。

socket.emit < - 仅由 - > socket.on 触发,连接到。

解决方案:使用io.emit发送给所有客户端

 io.on("connection", (socket) => { ... });