2012-02-19 71 views
27

我有這樣的代碼一個聊天室,現在是設置缺口和房間:瞭解有多少人是在socket.io

io.sockets.on('connection', function(client){ 
    var Room = ""; 
    client.on("setNickAndRoom", function(nick, fn){ 
     client.join(nick.room); 
     Room = nick.room; 
     client.broadcast.to(Room).emit('count', "Connected:" + " " + count); 
     fn({msg :"Connected:" + " " + count}); 
    }); 

我想知道我怎麼能拿多少人連接到一個特定的聊天室......像Room.length

客戶端:

function Chat(){ 
    this.socket = null; 
    this.Nickname = ""; 
    this.Room = ""; 
    var synched = $('#syncUp'); 
    this.Connect = function(nick, room){ 
     socket = io.connect('http://vybeing.com:8080');  
     Nickname = nick; 
     Room = room; 
     //conectarse 
     socket.on('connect',function (data) { 
      socket.emit('setNickAndRoom', {nick: nick, room: room}, function(response){ 
       $("#connection").html("<p>" + response.msg + "</p>"); 
      }); 
     }); 
} 

我發現這一點,但它給未定義:

count = io.rooms[Room].length; 
+0

一些更多的信息將是很好,被連接到一個普通的IRC服務器或自定義聊天服務器程序進行? – 2012-02-19 19:46:42

+0

聊天服務器程序 – re1man 2012-02-19 19:48:49

+0

+1。這看起來應該比它容易。 – kdbanman 2014-06-26 09:14:49

回答

21

如果您使用的版本< 1,

var clients = io.sockets.clients(nick.room); // all users from room

+5

只是提醒一下,這將返回房間中的一系列插座。所以要獲得房間裏的人數,一定要將.length添加到上面的代碼 – levi 2012-06-18 21:21:34

+0

正是我在找的東西。謝謝! – 2014-06-18 14:09:57

+7

'io.sockets'返回默認的'Namespace'(''/'')。從socket.io 1.0.x開始,'Namespaces'沒有'.clients()'方法。我只是測試它,'io.sockets.clients === undefined'。這個答案不再適用。 – kdbanman 2014-06-26 08:05:14

69

對於socket.io版本> = 1.0:

注意,房間變成了實際的類型與.length屬性在1.4中,所以1.4.x的方法應該從現在起保持穩定。

要計算連接到'my_room'所有客戶端:

1.4+:

var room = io.sockets.adapter.rooms['my_room']; 
room.length; 

的1.3.x:

var room = io.sockets.adapter.rooms['my_room']; 
Object.keys(room).length; 

1.0.x的到1.2.x版本:

var room = io.adapter.rooms['my_room']; 
Object.keys(room).length; 

這是假設你正在運行與default room adapter在單個節點上(而不是cluster)。如果你在一個集羣中,事情是more complicated


其他相關的例子:

  • 計數所有客戶端連接到服務器:

    var srvSockets = io.sockets.sockets; 
    Object.keys(srvSockets).length; 
    
  • 計數所有客戶端連接到命名空間'/chat'

    var nspSockets = io.of('/chat').sockets; 
    Object.keys(nspSockets).length 
    
3

在版本1.4.5

var clientNumber = io.sockets.adapter.rooms[room].length; 
0

我使用的是1.4.6,這做的伎倆:

Object.keys(io.sockets.connected).length 
+0

此方法只計入單個nodejs中。 – tuananh 2017-02-06 04:50:01

+0

這將計算所有房間中所有連接的客戶端。 – talent 2017-08-11 12:36:07

6

對於socket.io 1.4.6,什麼工作對我來說是指定除了房間之外的名字空間。使用默認名稱空間時,您可以將其指定爲['/']。例如,可以連接到默認命名空間(NSPS)的房間「廚房」客戶端的數量,你可以這樣寫:

var io = require('socket.io')(); 
io.nsps['/'].adapter.rooms['kitchen'].length 

請注意:如果沒有人加入了一個房間,現在也沒有已創建,因此io.nsps['/'].adapter.rooms['kitchen']將返回undefined。如果您嘗試在未定義的廚房上撥打.length,您的應用將崩潰。

+0

非常感謝的人! – furcicm 2016-07-29 10:59:44

0

我想獲得一個房間裏的用戶列表。 這最終成爲我的解決方案。

我添加了一個用戶名屬性到我的套接字,但爲了完整性,我將其更改爲「id」,它是套接字的ID。

var sockets = io.in("room_name") 
Object.keys(sockets.sockets).forEach((item) => { 
    console.log("TODO: Item:", sockets.sockets[item].id)    
}) 

Socket.io V2.0.3

0

對於socket.io V2.0.3,我結束了運行Redis的服務器,並使用socket.io-redis的插件。然後,你可以這樣做:

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => { 
    console.log(clients); // an array containing socket ids in 'room1' and/or 'room2' 
}); 

代碼爲https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

kevzettler向我指出socket.io,Redis的


對方回答從懶惰的編碼器socket.io V2.0.3沒有爲我工作,它給了我所有連接的客戶的名單,不管房間。

-1

把這個功能,它會給你失效保護,以防止崩潰:

var roomCount = io.nsps['/'].adapter.rooms[roomName]; 
if (!roomCount) return null; 
return roomCount.length;