是否可以根据socket.io上特定的发射数据来计数当前连接?

问题描述 投票:-1回答:1

我想知道我指定的数据当前有多少个连接。

例如;

客户:

var socket = io('http://localhost:8080');

/* ------------------------------------ */

socket.emit('status',{'mode':online,'user':userID});

app.js:

const server = require('http').createServer();
const io = require('socket.io')(server);

/* ------------------------------------ */

io.on('connection',function(socket){

    socket.on('status',function(response){

        response.user
        // Is it possible to know the number of current connections this ID is in?

    }
}
node.js count socket.io connection
1个回答
0
投票

听起来您正在尝试获取已连接客户端的列表。

[您将需要在服务器上保留客户端列表,并在每次调用status事件时将其追加到客户端列表中。您可以创建一个事件来删除当前套接字,但是还需要添加一个处理程序来确定套接字何时断开连接,以便可以将其从列表中删除。

概述流程的简单演示:

let connected = [];
io.on('connection', (socket) => {
    socket.on('status', (message) => {
        // assign the current socket to the data
        message.socket = socket.id;

        connected.push(message);
    });

    socket.on('logoff', (message) => {
        // update if a socket disconnects
        connected = connected.filter(item => item.user !== message.user);
    });

    socket.on('disconnect', (message) => {
        // update if a socket disconnects
        connected = connected.filter(item => item.socket !== socket.id);
    });

    socket.on('online', (message) => {
       // return users online
       socket,emit('online', connected); 
    });

    socket.on('count', (message) => {
        let count = connected.filter(item => item.user === message.user).length;
       socket.emit('count', {count: count});
    });

OP发表评论后更新

io.on('connection', (socket) => {
    socket.on('status', (message) => {
        // add the data to the socket. nb, always validate first
        socket.data = {
            user: message.user,
            mode: message.mode
        };

        socket.emit('status')
    });

    socket.on('count', (message) => {
        // check if we looking a user or all users
        const query = (message && message.user) ? message: null;

        // map the connected sockets to an array
        let sockets = Object.values(io.sockets.connected);

        // if we searching for a user, then filter for them
        if (query) {
            sockets = sockets.filter(item => item.data && item.data.user === query.user);
        }

        // reduce to tally the sockets
        const count = sockets.reduce((accumulator, currentValue) => {
            return (currentValue.data.user) ? accumulator + 1 : accumulator;
        }, 0);

        socket.emit('count', {query, count: count});
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.