我不知道这是一个错误还是我做错了但是如果我播放了多条消息,只有第一条消息被广播到正确的房间,所有其他消息都被广播到连接到套接字的每个人.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,第二个广播给所有人。
怎么回事???
答案 0 :(得分:1)
您正在做出错误的(虽然可以理解)假设socket.broadcast.to(room)
对套接字连接的内部状态进行持久更改,以便后续广播进入指定的房间。实际上,它在重置之前只能持续一个emit
。 to
方法旨在链接到每个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' );
});