sockets - metodos - socket io send to all
socket.emit() vs. socket.send() (6)
¿Cuál es la diferencia entre estos dos?
Noté que si cambiaba de socket.emit
a socket.send
en un programa en funcionamiento, el servidor no recibía el mensaje, aunque no entiendo por qué.
También noté que en mi programa si cambiaba de socket.emit
a socket.send
, el servidor recibe un mensaje, pero parece que lo recibe varias veces. Cuando uso console.log()
para ver lo que el servidor recibió, muestra algo diferente de cuando uso socket.emit
.
¿Por qué este comportamiento? ¿Cómo sabes cuándo usar socket.emit
o socket.send
?
Con socket.emit puedes registrar un evento personalizado como ese:
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 hace lo mismo, pero no te registras a ''noticias'' sino a un mensaje:
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);
});
En los sistemas de comunicación bidireccionales básicos, socket.emit ha demostrado ser más convincente y fácil de usar (experiencia personal) y es parte de Socket.IO que está principalmente diseñado para tales propósitos
Simple y preciso (Fuente: Socket.IO google group ):
socket.emit
permite emitir eventos personalizados en el servidor y el cliente
socket.send
envía mensajes que se reciben con el evento ''message''
TL; DR:
socket.send(data, callback)
es esencialmente equivalente a llamar a socket.emit(''message'', JSON.stringify(data), callback)
Sin mirar el código fuente, supongo que la función de envío es la edición más eficiente : ¿para enviar mensajes de cadena, al menos ?
Entonces, básicamente, emitir te permite enviar objetos, lo cual es muy útil.
Toma este ejemplo con socket.emit
:
sendMessage: function(type, message) {
socket.emit(''message'', {
type: type,
message: message
});
}
y para aquellos que mantienen puntaje en casa, aquí está lo que parece usar socket.send
:
sendMessage: function(type, message) {
socket.send(JSON.stringify({
type: type,
message: message
}));
}
https://socket.io/docs/client-api/#socket-send-args-ack
socket.send // Envía un evento de mensaje.
socket.emit (eventName [, ... args] [, ack]) // puede custome eventName
socket.send
está implementado para compatibilidad con la interfaz WebSocket de vanilla. socket.emit
es una característica de Socket.IO solamente. Ambos hacen lo mismo, pero socket.emit
es un poco más conveniente en el manejo de mensajes.