sockets - 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
解决方案
在他们的 github 上发布后,我发现有一种方法可以发送给所有人,但它非常隐藏在 imo 文档中:
io.sockets.emit
是你想要使用的。
推荐阅读
- python - 如何从 numpy datetime 数组返回到 datetime?
- android - 编辑文本更改时在编辑文本下方显示下拉列表
- javascript - Javascript如何对表求和
- java - JFrame在设计选项卡中隐藏部分
- c++ - 我在 mingw 中收到“权限被拒绝”错误
- sql - 在 Oracle 中将虚拟行显示为按子句标题分组
- python - 代码不会写入 CSV 文件 Python3,为什么?
- reactjs - 在重新验证中收到响应时,是否有任何方法可以触发错误消息?
- linux - 遍历数组并输出 TSV 报告
- python - 如何在 Python 中创建两台 PC 之间的 TCP 连接