2014-06-05 102 views
1

它是一個重複的問題,但我想問一下它的更多說明。
我想使用socket.io創建一個私人聊天。雖然google搜索,我發現2個解決方案:列出聊天室中的用戶

  1. 使用一個數組來存儲活動用戶列表
  2. 使用客房概念

假設我的應用程序擁有數百萬的活躍用戶。
這就是我想要的:我有我的朋友列表在MySQL數據庫中,並且當我登錄時,我想要所有的朋友和他們的狀態(活動或不活動)。

案例1.如果我使用數組來存儲所有活動用戶,那麼它工作得很好,但這是一種將所有連接到我的應用程序的用戶存儲在數組中的好方法嗎?

案例2.如果我使用房間的概念,其中每個用戶的朋友有一個獨特的房間, 然後每當用戶登錄時,他必須加入所有房間。它也適用於我,但在這種情況下,我怎麼知道我的朋友是否活躍?

我想知道哪種解決方案適用於我的應用程序,其中有數百萬用戶,或者有其他解決方法。

+0

你可以確定你使用的是什麼版本的socket.IO,如果你打算使用幾個節點或只有一個節點? –

+0

我使用0.9.16版本的socket.io – pitu

回答

2

我會用第三個解決方案:

  • 用戶設置每個插座
  • 看看客戶端套接字在一個房間裏,你需要列出用戶在房間內的任何時間列表

如果您使用的是socket.IO pre 1.0,那麼您可以使用io.sockets.clients(roomName)來獲取房間中的套接字。

隨着socket.IO 1.0,它不是真正清楚這將是最乾淨的解決方案列出連接到室內插座:

現在這裏有一個解決方法功能:

function roomSockets(roomId) { 
    var clients = io.sockets.adapter.rooms[roomId], 
     sockets = []; 
    for (var clientId in clients) sockets.push(io.sockets.connected[clientId]); 
    return sockets; 
} 

請注意,它可能無法與所有適配器一起工作,所以它至多是一種解決方法。

+0

我使用了var clients = io.sockets.clients('room1');控制檯輸出:[object Object]如何打印所有客戶列表 – pitu

+0

使用'io.sockets.clients('room1')。forEach(function(s){console.log(s)});' –

+0

例子:[Here's我是如何在聊天室的舊版本中將用戶列入房間的](https://github.com/Canop/miaou/blob/c21bfa3481b75ef0750ed09905e5e51c1247e096/libs/ws.js#L193) –