簡體   English   中英

如何獲取socket.io中所有連接的客戶端

[英]how to Get all connected clients in socket.io

我有 socket.io v2.3,我正在嘗試從不同的文件中獲取所有連接的 sockets。 這是我的設置:

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,
};

在 diff 文件中,我導入getMyNameIO並嘗試獲取所有已連接的客戶端,但我遇到了麻煩。 試過做

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

但客戶不是 function。然后我嘗試導入 socket.io 和 use.of,但沒有返回任何內容。 哪里做錯了,我該如何解決?

試試這個。 我懷疑是 scope 問題或操作順序問題。 無論哪種方式,這都應該解決它或給你一個更有用的錯誤。 我試圖維護您的命名方案,這讓我有點頭疼。 =)

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); 我得到一個 object 和所有 sockets。我怎樣才能得到一個數組?

查看 API https://socket.io/docs/v2/server-api/#Namespace我沒有看到對 Namespace.sockets 的引用。 這並不意味着它不存在。 我添加了一個 getClients function,它將返回一個客戶端 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM