Qual é a diferença entre io.sockets.emit e broadcast?

98

Qual é a diferença entre io.sockets.emit e socket.broadcast.emit? É apenas aquele broadcast emite para todos, MAS o socket que o envia?

Parece que eles podem ser usados ​​indistintamente:

io.sockets.on('connection', function (socket) {
  //these should do the same thing  
  io.sockets.emit('this', { receivers: 'everyone'});

  socket.broadcast.emit('this', { receivers: 'everyone but socket'}); //emits to everyone but socket
  socket.emit('this', { receivers: 'socket'}); //emits to socket
});
swiecki
fonte

Respostas:

175

io.sockets.emit irá enviar para todos os clientes

socket.broadcast.emit iráenviar a mensagem para todos os outros clientes exceto a conexão recém-criada

Esta postagem Socket.IO Wiki ajudará a todos que estão lendo esta pergunta:

Jayantha Lal Sirisena
fonte
22
bem, isso levou 3 horas de resolução de problemas para descobrir.
Petrogad
Posso verificar se esse é realmente o comportamento, mas não consigo ver nenhuma documentação para socket.broadcast nem socket.broadcast.emit nos documentos do Github nem no site Socket.io . Estou esquecendo de algo? (e o wiki sumiu)
scipilot
1
O que é ainda "melhor" nisso é que o aplicativo de "bate-papo" de exemplo faz uso quase exclusivo, socket.broadcast.emitenquanto a API nunca é documentada em lugar nenhum.
Avi Cherry
@Sobiaholic Ainda não encontrei o motivo óbvio para não emitir a alteração para a conexão atual. É para quando o cliente que acionou o evento já havia feito uma atualização otimista com antecedência?
Nick Pineda
2
Não é "exceto as conexões recém-criadas", deve ser "para todos os outros clientes, exceto ele mesmo". Você pode ter uma conexão recém-criada (um cliente entrando na sala de chat) e enviar uma mensagem usando socket.broadcast.emite eles a receberão, mas não você.
NiCk Newman
47

socket.broadcast.emit()se comporta de maneira semelhante io.sockets.emit, mas em vez de emitir para todos os soquetes conectados, ele emitirá para todos os soquetes conectados, exceto aquele que está sendo chamado. Portanto, neste caso, o soquete referenciado por socketnão receberá o evento.

Karthic Rao
fonte
6
mais uma atualização - de acordo com a resposta de Jayantha e minha própria análise, também NÃO emite para conexões recém-criadas, ou seja, as novas conexões de cliente que foram criadas após o 'soquete' ter sido criado. Esta é uma diferença importante e fundamental !!
Anmol Saraf
6
A "conexão recém-criada" a que Jayantha se refere é o soquete cujo evento de conexão está sendo tratado e que emitirá a transmissão. O objetivo da transmissão é que ela vai para todos os clientes, exceto o soquete de 'transmissão' - a ordem em que as conexões do cliente foram estabelecidas não faz diferença.
Ponto
8

Cenário: 1: - Com o uso do diagrama detalhado io.sockets.emit: -io.sockets.emit

Aqui, cada soquete recebe a mensagem, incluindo o iniciador .

  // BY IO>SOCKETS>EMIT
   io.sockets.emit('MyChannelBroadcast',
               {
                 owner:"Anshu Ashish",
                 clientCount:clients,
                 message:"Welcome All"
               }
    );

Cenário: 2: - Pelo uso de socket.broadcast.emit Diagrama detalhado: -socket.broadcast.emit

Aqui, todos os soquetes estão recebendo a mensagem, exceto um, ou seja, o iniciador .

    // BY SOCKET>BROADCAST>EMIT
   socket.broadcast.emit('BroadCastExceptMe',{data:"HAVE A NICE DAY"});

Conclusão: - Agora dependerá totalmente de nossa exigência comercial qual será o preferível.

Anshu Ashish
fonte