【问题标题】:how to Get all connected clients in socket.io如何在 socket.io 中获取所有连接的客户端
【发布时间】:2021-03-18 06:54:52
【问题描述】:

我有 socket.io v2.3,我正在尝试从不同的文件中获取所有连接的套接字。这是我的设置:

const io = require('socket.io');
let IO;
let myNameIO;

module.exports = {
    create: (server) => {
        IO = io(server, { cors: { origin: '*' } });
        const redisConnection = redisAdapter({ host: redisHost, port: redisPort });
        IO.adapter(redisConnection);

        IO.on('connection', (socket) => {
            console.log('a user connected');
        });
        IO.on('disconnect', (socket) => {
            console.log('disconnected');
        });

        myNameIO = IO.of('/my-name');
        myNameIO.on('connection', function (socket) {
            console.log('someone connected');
        });
    },
    getIO: () => IO,
    getMyNameIO: () => myNameIO,
};

在一个差异文件中,我导入 getMyNameIO 并尝试获取所有已连接的客户端,但我遇到了麻烦。试过了

getMyNameIO().clients((error, clients) => {
    console.log(clients, '-=--=-=');
});

但客户端不是函数。然后我尝试导入 socket.io 和 use.of,但这并没有返回任何东西。哪里做错了,我该如何解决?

【问题讨论】:

  • 这里没有足够的信息,但我猜你会在调用 create: (server) => 之前调用 getMyNameIO().clients(...)
  • @MichaelHobbs 您还需要什么其他信息?创建首先被调用

标签: javascript node.js websocket socket.io


【解决方案1】:

试试这个。我怀疑是范围问题或操作顺序问题。无论哪种方式,这都应该解决它或给你一个更有用的错误。我试图维护你的命名方案,这让我有点头疼。 =)

const io = require('socket.io');
const socketServer = {
    _initialized: false,
    _myNameIO: null,
    _IO: null,
    _myNameIOClients: new Map(),
    get myNameIO() {
        if (!socketServer._initialized) throw new Error('socketServer.create not called!')
        return socketServer._myNameIO
    },
    get IO() {
        if (!socketServer._initialized) throw new Error('socketServer.create not called!')
        return socketServer._IO
    },
    create: (server) => {
        IO = io(server, { cors: { origin: '*' } });
        const redisConnection = redisAdapter({ host: redisHost, port: redisPort });
        IO.adapter(redisConnection);

        IO.on('connection', (socket) => {
            console.log('a user connected');
        });
        IO.on('disconnect', (socket) => {
            console.log('disconnected');
        });

        myNameIO = IO.of('/my-name');
        myNameIO.on('connection', function (socket) {
            console.log('someone connected');
            socketServer._myNameIOClients.set(socket.id, socket)
        });

    },
    //getIO: () => IO,
    //getMyNameIO: () => myNameIO,
    getIO: () => socketServer._IO,
    getMyNameIO: () => socketServer._myNameIO,
    get myNameIOClients() {
       return socketServer._myNameIOClients
    },
    getClients: () => new Promise((resolve,reject)=>socketServer._myNameIO.clients((error, clients)=> error ? reject(error) : resolve(clients))
}),
};
module.exports = socketServer

当我执行 console.log(socketServer.myNameIO.sockets);我得到一个带有所有套接字的对象。我怎样才能得到一个数组?

查看 API https://socket.io/docs/v2/server-api/#Namespace 我没有看到对 Namespace.sockets 的引用。这并不意味着它不存在。我添加了一个 getClients 函数,该函数将返回一组客户端 ID。

const socketServer = require('./socketServer ')
socketServer.getClients()
    .then(clients=>{
       // clients an array of client IDs
    })
    .catch(e=>console.error('Error is socketServer.getClients()', e))

我认为您真正想要的是管理连接。一种方法是在连接进入时对其进行映射。

const socketServer = require('./socketServer ')

// This is a Map
let myNameIOClients = socketServer.myNameIOClients
// We can easily turn it into an array if needed
let myNameIOClientsArray = Array.from(socketServer.myNameIOClients)

【讨论】:

  • 是的,这行得通!我正在使用redis,我们仍然这样做吗?而且我们不需要 getIO 和 getMyNameIO,对吧?
  • 当我做console.log(socketServer.myNameIO.sockets); 时,我得到一个带有所有套接字的对象。我怎样才能得到一个数组?
  • socketServer 代码变得杂乱无章,当您对自己想要做什么有了更好的了解时,需要对其进行重构。
  • 对不起,如果我不清楚...我有一个连接到 redis 的 socket.io 正在运行。我要做的就是从命名空间获取所有连接。你知道更好/更清洁的方法吗?
  • getClients 将返回一个客户端 ID 列表。我假设但不确定它是通过 redis 同步的。在这一点上,你真的超出了我对 socket.io 的了解
猜你喜欢
  • 2018-04-06
  • 2013-05-07
  • 2017-05-10
  • 2017-11-29
  • 2013-10-16
  • 2011-09-27
  • 2011-10-22
  • 2019-08-04
  • 2016-06-09
相关资源
最近更新 更多