2013-12-11 30 views
0

我目前使用的是Node.js,它工作得很好,爲每個用戶保存套接字。還保存所有瀏覽器選項卡套接字ID。我的意思是每個標籤都有一個獨特的插座所以一個獨特的用戶有多個套接字。這是我做的。向node.js中的一個特定用戶的所有套接字發送消息

usersObj = {}; 

io.sockets.on('connection', function(socket) { 
    socket.on("new user", function(data, callback) { 


     if (data.id in usersObj){ // if user is in usersObj, save it's new socket.id 

      usersObj[data.id].sockets_ids.push(socket.id); 

      // how to send a message to all sockets of a specific user 
      // usersObj[data.id].sockets.socket.emit("hi", { data: "Hi!" }); this does not work. 

     } else { // if user is not in usersObj, make a new object and save it's socket. 

      usersObj[data.id] = { 
       "sockets_ids" : [ socket.id ] // array for all sockets id of this user 
      } 

     } 
    }); 
}); 

現在userObj用於與ID 10和用戶ID爲11的用戶,是這樣的:

usersObj = { 
    10 = { 
     sockets_ids = [ 
      asdf9877687sdfasdf, // sample socket ID for browser tab 1 
      459djhfskdhjfasd8f, // sample socket ID for browser tab 2 
      oewurwoer845935739  // sample socket ID for browser tab 3 
     ] 

    }, 
    11 = { 
     sockets_ids = [ 
      xcdf987sdfsddfasdf, // sample socket ID for browser tab 1 
      ty9djhfskdhjf45344, // sample socket ID for browser tab 2 
      sawurwoer84593xcvx  // sample socket ID for browser tab 3 
     ] 

    }, 

} 

現在我想發出一個消息給Hi!所有套接字所屬的用戶ID爲10 所以我應該通過他們在用戶的sockets_ids數組中的ID來獲取套接字,並向我的消息發送到這個套接字。
我該怎麼做?
這是完全錯誤的,不起作用。
usersObj[data.id].sockets_ids.socket.emit("hi", { data: "Hi!" });

在此先感謝。

回答

2

您通過sockets_ids需要循環,像這樣:

usersObj[data.id].sockets_ids.forEach(function(id){ 
    io.sockets.socket(id).emit("hi", { data: "Hi!" }); 
}); 

你也應該考慮存儲實際Socket對象,而不是socket.id,如上面所使用的方法是socket.io的內部方法,因此不可靠。 See here

+0

謝謝,我現在正在保存實際的套接字,我正在考慮一個更好的代碼來減少內存使用率。那麼有沒有辦法看到JavaScript中變量的大小?我想知道每個套接字對象的大小... – Pars

+1

嘗試http://stackoverflow.com/questions/1248302/javascript-object-size – levi

相關問題