【发布时间】: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
【问题讨论】: