2016-09-29 74 views
0

如何跟蹤socket.io中的所有連接的客戶端?使用socket.io跟蹤連接的套接字

我已經試過這在服務器上:

let numSockets = 0; 

io.on('connection', (socket) => { 
    io.sockets.emit('numSockets', ++numSockets); 

    socket.on('disconnect',() => { 
    io.sockets.emit('numSockets', --numSockets); 
    }); 
}); 

,這在客戶端上:

const socket = io(); 

socket.on('numSockets', function (numSockets) { 
    console.log(numSockets); 
}); 

它確實打印了一些,但數量,但是,如果我打開兩個窗口,它顯示了4個連接的插座。

這是正確的方法嗎?

我想要實現的是在我的網站的側邊欄中打印連接套接字的ID列表,並讓用戶設置用戶名(而不是自動生成的ID),如果他們想。

但在開始之前,我會確保能夠以正確的方式跟蹤套接字。

回答

0

存在Namespace#connected對象,其中包含所有連接到特定命名空間的套接字(由其ID標識)。

要檢索默認命名空間(/)的插座的id:

let clientIds = Object.keys(io.of('/').connected); 

(其中io是服務器實例)

+0

所以,我要建立一個[中間件](http://socket.io/docs/server-api/#namespace#use(FN:功能):命名空間)和使用'它內部的io.sockets.emit(io.of('/')。connected)'告訴所有客戶端何時連接了新的套接字? – mortensen

+0

@mortensen是的,這將發送套接字ID的列表到所有連接的客戶端。 – robertklep

0

我不認爲io.sockets.emit(io.of('/').connected)是一個好主意,因爲它會發送socket對象的散列這是一個很大的數據:-)

你可以嘗試以下功能:

function findUsersConnected(room, namespace) { 
    var names = []; 
    var ns = io.of(namespace || "/");  

    if (ns) { 
    for (var id in ns.connected) { 
     if(room) { 
     var roomKeys = Object.keys(ns.connected[id].rooms); 
     for(var i in roomKeys) { 
      if(roomKeys[i] == room) { 
      if (ns.connected[id].username) { 
       names.push(ns.connected[id].username); 
      } else { 
       names.push(ns.connected[id].id); 
      } 
      } 
     } 
     } else { 
     if (ns.connected[id].username) { 
      names.push(ns.connected[id].username); 
     } else { 
      names.push(ns.connected[id].id); 
     } 
     } 
    } 
    } 
    return names.sort(); 
} 

它返回連接到命名空間中的房間的用戶數組。如果套接字沒有socket.username屬性,則使用socket.id

例如:

var usersConnected = findUsersConnected(); 
var usersConnected = findUsersConnected('myRoom'); 
var usersConnected = findUsersConnected('myRoom', '/myNamespace');