Socket.io - 无法获得房间内的客户端数量

时间:2018-03-15 03:05:23

标签: javascript socket.io

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]数字应该减少但是由于某种原因它不会。相反,这个数字根本不会改变。我该如何解决这个问题?

1 个答案:

答案 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来计算用户数。