向node.js中一个特定用户的所有套接字发送消息

时间:2013-12-11 15:09:23

标签: node.js sockets socket.io

我目前正在使用Node.js并且它正在运行得非常好,为每个用户保存套接字。还保存所有浏览器选项卡套接字ID。我的意思是每个标签都有一个独特的插座所以一个独特的用户有多个套接字。这就是我的工作。

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
            }

        }
    });
});

现在,ID为10的用户的userObj和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
        ]

    },

}

现在我想向属于ID为10的用户的所有套接字发送消息Hi!。 所以我应该通过用户的sockets_ids数组中的ID获取套接字并向该套接字发出我的消息 我怎么能这样做?
这是完全错误的,不起作用 usersObj[data.id].sockets_ids.socket.emit( "hi", { data: "Hi!" } );

提前致谢。

1 个答案:

答案 0 :(得分:2)

您需要循环遍历sockets_ids,如此:

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

此外,您应该考虑存储实际的套接字对象而不是socket.id,因为上面使用的方法是socket.io的内部方法,因此不可靠。 See here