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.