2017-08-02 64 views
1

你怎麼能使用socket.io 2.0socket.io 2.0獲取連接的客戶端在一個房間裏


我已經嘗試過類似的問題的解決檢索所有連接的客戶端在一個房間:https://stackoverflow.com/a/45160538/2189845

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

但是,無論房間如何,這都會在所有套接字連接上循環。所以,上面的代碼給出了相同的結果:

Object.keys(io.sockets.sockets).forEach((item) => { 
    console.log("general socket: Item:", item); 
}); 

回答

0

不幸的是,這個答案並不完全滿足有機磷農藥的問題。如果您正在使用socket.io-redis管理套接字連接,你可以得到連接的客戶端一樣

io.of('/').adapter.clients((err, clients) => { 
    console.log(clients); // an array containing all connected socket ids 
}); 

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

// you can also use 

io.in('room3').clients((err, clients) => { 
    console.log(clients); // an array containing socket ids in 'room3' 
}); 

這是來自:https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

+1

這個工程,所以我接受這是正確的答案。當你只運行一個節點服務器時,感覺就像是過度殺毒。你需要運行一個額外的redis服務器,僅用於擁有連接客戶端的列表。希望有一個更簡單的解決方案,但我會去爲這一個。它讓我們準備升級到多個節點服務器我猜。 –

+0

如何使用套接字ID跟蹤用戶信息?可以使用redis鍵值對,但如果服務器重新啓動並且客戶端重新連接,則會創建一個新的套接字標識,並且舊套接字標識將保留在redis中,導致內存泄漏。 – Koder

0

嘗試:

io.sockets.clients('room_name').forEach(function(item) { 
    console.log(item.id);//any property of socket you want to print 
}); 

或者你可以嘗試:

var clients = io.sockets.adapter.rooms['room_name'].sockets; 
for (var clientId in clients) { 

    //this is the socket of each client in the room. 
    var SocketofClient = io.sockets.connected[clientId]; 
    console.log(SocketofClient.id); 
} 
+2

這些都是無效2.0下去了。對於第一個解決方案,我收到'TypeError:fn.bind不是函數','TypeError:無法讀取未定義的屬性'套接字''。 –

相關問題