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?

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);
});

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


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
    }));
}

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.


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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.