首页 > 解决方案 > Socket.io 不会发送给所有客户端

问题描述

这里有很多关于 socket.io 的问题,但我以前没见过这个。基本上,我正在构建一个应用程序,我想让两个人加入,然后将他们启动到游戏中。

问题是socket.emit只发送给一个用户(触发事件的最后一个用户)而不是另一个。如果我也使用socket.broadcast.emit,我实际上可以向其他用户发出,但我不应该这样做。我的理解是,两个客户端都应该接收任何发出的消息,并且 broadcast.emit 应该仅限于除发起者之外的所有客户端。这是我的代码(我已注释掉将其发送给两个客户端的行:

const app = require('express')()
const http = require('http').createServer(app)
const constants = require('./constants')
const draft = require('./game/draft')
const io = require('socket.io')(http, {
    cors: {
        origin: "http://localhost:3000  ",
        methods: ["GET", "POST"]
      }
})

// auth middleware
io.use((socket, next) => {
    const username = socket.handshake.auth.username;
    if (!username) {
        return next(new Error("invalid username"));
    }
    socket.username = username;
    next();
});

// connections
io.on('connection', function (socket) {
    if (io.engine.clientsCount > constants.CONNECTION_LIMIT) {
        socket.emit('err', { message: 'reach the limit of connections' })
        socket.disconnect()
        console.log('Disconnected...')
        return
    }
})

io.on("connection", (socket) => {
    const users = [];
    for (let [id, socket] of io.of("/").sockets) {
      users.push({
        userID: id,
        username: socket.username,
      });
    }
    socket.emit("users", users);
});

io.on("connection", (socket) => {
    socket.broadcast.emit("user connected", {
      userID: socket.id,
      username: socket.username,
    });
});

io.on('connection', function (socket) {
    if (io.engine.clientsCount === 2) {
        socket.emit('START_GAME', { message: 'both players have joined the lobby' })
        // socket.broadcast.emit('START_GAME', { message: 'both players have joined the lobby' })
        const {player1comps, player2comps} = draft.startDraft()
    }

})

在此处输入图像描述

如您所见,发射只会发送给其中一个客户端。服务器显然知道有两个客户端,因为它在看到两个客户端之前无法触发该功能。超级奇怪,因为文档非常非常清楚,socket.emit应该适用于所有人,不像socket.broadcast.emit

标签: socketssocket.io

解决方案


在他们的 github 上发布后,我发现有一种方法可以发送给所有人,但它非常隐藏在 imo 文档中:

io.sockets.emit是你想要使用的。


推荐阅读