【问题标题】:Socket.io emit NOT going to all clientsSocket.io 不会发送给所有客户端
【发布时间】:2021-09-12 14:18:56
【问题描述】:

这里有很多关于 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

【问题讨论】:

    标签: sockets socket.io


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 2017-08-17
      • 2021-07-10
      • 1970-01-01
      • 2018-01-30
      • 2019-08-04
      • 1970-01-01
      • 2022-01-15
      • 2022-11-15
      相关资源
      最近更新 更多