簡體   English   中英

如何獲得 socket.io 房間內的客戶數量?

[英]how to get socket.io number of clients in room?

我的 socket.io 版本 1.3.5

我想獲得特定房間的客戶數量。

這是我的代碼。

 socket.on('create or join', function (numClients, room) {
            socket.join(room);
    });

我使用此代碼讓客戶進入房間:

console.log('Number of clients',io.sockets.clients(room));

這適用於版本 3

io.sockets.adapter.rooms.get(roomName).size

要獲取房間中的客戶數量,您可以執行以下操作:

    function NumClientsInRoom(namespace, room) {
      var clients = io.nsps[namespace].adapter.rooms[room];
      return Object.keys(clients).length;
    }

這個變量 clients 將保存一個對象,其中每個客戶端都是一個鍵。 然后,您只需獲取該對象中的客戶端(鍵)數量。

如果您尚未定義命名空間,則默認命名空間為“/”。

有一個計數器變量來保持計數,當有人加入時增加,當人們斷開連接時減少。

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

var numClients = {};

socket.on('join', function (room) {
    socket.join(room);
    socket.room = room;
    if (numClients[room] == undefined) {
        numClients[room] = 1;
    } else {
        numClients[room]++;
    }
});

socket.on('disconnect', function () {
     numClients[socket.room]--;
});

這對我有用。

// check if your room isn't undefined.
if (io.sockets.adapter.rooms['your room name']) 
{
   // result
   console.log(io.sockets.adapter.rooms['your room name'].length);
}

這對我有用

io.in('yourRoom').allSockets().then(result=>{
    console.log(res.size) })

在 socket.io ^1.4.6

function numClientsInRoom(namespace, room) {
    var clients = io.nsps[namespace].adapter.rooms[room].sockets;
    return Object.keys(clients).length;
}

您需要將.sockets添加到rooms[room] ,因為變量 clients 將所有連接保存在sockets變量中。

我參加聚會有點晚了,但我找到了一個有效的解決方案:

io.in('YOUR_ROOM').engine.clientsCount;

socket.io 的rooms是一個Map ,其元素映射到Set s。

您使用get(roomId)Map中獲取該roomId的值,並使用.size來表示集合中的元素數,這與.length表示數組中的元素數不同。

 socket.on("join-room",roomId => { const room = io.of("/yourNameSpace").adapter.rooms.get(roomId) if(room === undefined || room.size < 2) { socket.join(roomId) }else { io.of("/yourNameSpace").emit("can't join link") } })

io.nsps['/'].adapter.rooms['your room name'].sockets;

如果您的命名空間不是/ ,請更改它。

2022 年只有一個使用 socket.io 4.5.1 對我有用:

io._nsps.get('/').adapter.rooms.get('your-room-id').size;

感謝@Abhishek Kumar,只是為了提高知名度而發表了頂級評論。

不帶適配器

如果您只有一個服務器實例,最簡單的方法是:

// rooms is a Map object
const rooms = io.of("/").adapter.rooms;
const roomSockets = rooms.get('roomid')

你可以從這里的官方文檔中看到

使用適配器 (Redis)

但是,如果您有多個服務器實例並且正在使用 Redis 之類的適配器,這將不起作用,因為它只會返回該實例內存中的套接字,因此根據您請求命中的服務器實例,結果會有所不同。

要獲得實際的房間和插座,您需要(對於 RedisAdapter):

// this is a Set of room ids
const rooms = await io.of("/").adapter.allRooms();
// or get the sockets directly if you know the room id
const roomSockets = await io.of("/").adapter.sockets(new Set(['room id']);

您可以在此處查看更多方法

最新文檔 (v4)

// 返回主命名空間的“room1”房間中的所有 Socket 實例

const sockets = 等待 io.in("room1").fetchSockets();

嘗試 sockets.size 或 sockets.length 以獲取實際計數

暫無
暫無

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

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