socket.emit () vs. socket.send ()

133

Qual a diferença entre esses dois?

Percebi que, se eu mudasse de socket.emitpara socket.sendem um programa de trabalho, o servidor não receberia a mensagem, embora eu não entenda o porquê.

Também notei que, no meu programa, se eu mudei de socket.emitpara socket.send, o servidor recebe uma mensagem, mas parece recebê-la várias vezes. Quando eu uso console.log()para ver o que o servidor recebeu, ele mostra algo diferente de quando eu uso socket.emit.

Por que esse comportamento? Como você sabe quando usar socket.emitou socket.send?

nó ninja
fonte

Respostas:

123

Com o socket.emit, você pode registrar eventos personalizados assim:

servidor:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

cliente:

var socket = io.connect('http://localhost');
socket.on('news', function (data) {
  console.log(data);
  socket.emit('my other event', { my: 'data' });
});

Socket.send faz o mesmo, mas você não se registra em 'news', mas na mensagem:

servidor:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.send('hi');
});

cliente:

var socket = io.connect('http://localhost');
socket.on('message', function (message) {
  console.log(message);
});
Charles
fonte
3
Não parece uma diferença muito grande. Parece que socket.emit () pode fazer tudo o que socket.on () pode. Por que eles tiveram que fazer essa função?
Node ninja
2
Não sei, verifiquei o código fonte e eles fazem quase o mesmo ( github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318 ). Talvez seja histórico e apenas para compatibilidade com versões anteriores.
Charles
37
Além disso, esteja ciente, futuros leitores desta publicação, de que se trata de soquetes socket.io, não de node.js TCP, UDP ou Unix.
Aredridel # 25/12
3
É possível emitir com Websockets de baunilha javascript?
Alex Buznik
11
Parece que socket.sendé simplesmente um apelido parasocket.emit('message', message);
Mohit Gangrade
92

Simples e preciso (Fonte: Socket.IO google group ):

socket.emit permite emitir eventos personalizados no servidor e no cliente

socket.sendenvia mensagens recebidas com o 'message'evento

MD
fonte
45

TL; DR:

socket.send(data, callback) é essencialmente equivalente a chamar socket.emit('message', JSON.stringify(data), callback)

Sem olhar para o código-fonte, eu assumiria que a função de envio é uma edição mais eficiente : para enviar mensagens de string, pelo menos ?

Então, sim, basicamente emitir permite que você envie objetos, o que é muito útil.

Veja este exemplo com socket.emit:

sendMessage: function(type, message) {
    socket.emit('message', {
        type: type,
        message: message
    });
}

e para quem mantém a pontuação em casa, eis o que parece usar socket.send:

sendMessage: function(type, message) {
    socket.send(JSON.stringify({
        type: type,
        message: message
    }));
}
Kyle Shay
fonte
27

socket.sendé implementado para compatibilidade com a interface WebSocket vanilla. socket.emité recurso apenas do Socket.IO. Ambos fazem o mesmo, mas socket.emité um pouco mais conveniente no tratamento de mensagens.

artch
fonte
O socket.emit não se limita ao Socket.IO, mas também funciona na rede.
Ajay
0

Em sistemas básicos de comunicação bidirecional, o socket.emit provou ser mais convincente e fácil de usar (experiência pessoal) e faz parte do Socket.IO, construído principalmente para esses fins

Krishna Ganeriwal
fonte