const app = require('express')();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const port = 3000;
var numClients = {};
server.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
app.get('/', (req, res) => {
res.sendFile(__dirname + '/public/index.html');
});
app.get('/room1', (req, res) => {
res.sendFile(__dirname + '/public/room1.html');
});
app.get('/room2', (req, res) => {
res.sendFile(__dirname + '/public/room2.html');
});
app.get('/room3', (req, res) => {
res.sendFile(__dirname + '/public/room3.html');
});
// tech namespace
const tech = io.of('/tech');
tech.on('connection', (socket) => {
socket.on('join', (data) =>{
socket.join(data.room)
console.log(numClients[data.room]);
if (numClients[data.room] == undefined) {
numClients[data.room] = 1;
} else {
numClients[data.room]++;
}
console.log(numClients[data.room]);
//emittig message to people in room
tech.in(data.room).emit('message', `New user joined ${data.room} room!`)
})
socket.on('disconnect', (data) => {
console.log('user disconnected');
numClients[data.room]--;
tech.emit('message', 'user disconnected');
})
})
每当一个人加入房间时,numClients [data.room]数字会增加1.但是当一个人离开房间时,numClients [data.room]数字应该减少但是由于某种原因它不会。相反,这个数字根本不会改变。我该如何解决这个问题?
答案 0 :(得分:0)
您只是缺少用户离开的代码。因此,您的用户永远不会离开房间,除非他们断开连接(例如关闭浏览器)。
您应该像加入一样处理此案例:
socket.on('leave', (data) =>{
socket.leave(data.room, () => {
console.log(numClients[data.room]);
numClients[data.room]--;
console.log(numClients[data.room]);
//emittig message to people in room
tech.in(data.room).emit('message', `User left ${data.room} room!`)
});
});
现在,如果用户在离开后断开连接,请确保不要再次递减numClients
!
为了安全起见,我建议numClients[data.room]
是加入的用户列表,而不是数字。因此,您需要使用Object.keys(numClients[data.room]).length
来计算用户数。