NodeJS socket.io room&广播问题

时间:2014-04-02 14:04:54

标签: node.js socket.io

我不知道这是一个错误还是我做错了但是如果我播放了多条消息,只有第一条消息被广播到正确的房间,所有其他消息都被广播到连接到套接字的每个人.IO。

socket.on('clientMessage', function(content){
    socket.emit('serverMessage', {name : 'You said', data : content} );
    socket.get('username', function(err, username){
        if (err) { throw err; }         
        if(! username){
            username = socket.id;       
        }
        socket.get('room', function(err, room){
            if (err) { throw err; }
            if(room) {
                socket.broadcast.to(room);          
            }
            socket.broadcast.emit('serverMessage', {name: username, data : content} );
            socket.broadcast.emit('serverMessage', 'test' );

        });
    });
});

我的问题在于以下几行:

socket.broadcast.emit('serverMessage', {name: username, data : content} );
socket.broadcast.emit('serverMessage', 'test' );

使用两个socket.broadcast.emit,第二个广播给所有人。

怎么回事???

1 个答案:

答案 0 :(得分:1)

您正在做出错误的(虽然可以理解)假设socket.broadcast.to(room)对套接字连接的内部状态进行持久更改,以便后续广播进入指定的房间。实际上,它在重置之前只能持续一个emitto方法旨在链接到每个emit调用,如下所示:

        socket.broadcast.to(room).emit('serverMessage', {name: username, data : content});          
        socket.broadcast.to(room).emit('serverMessage', 'test' );

默认情况下,每个套接字都连接到一个空名称的房间,所以如果您打算广播到特定房间(如果存在),并以其他方式向所有人广播,那么您的代码可以简单地重写为:

    socket.get('room', function(err, room){
        if (err) { throw err; }
        // Default to the global room
        room = room || '';
        socket.broadcast.to(room).emit('serverMessage', {name: username, data : content} );            
        socket.broadcast.to(room).emit('serverMessage', 'test' );
    });