2012-07-16 3 views
88

Jaka jest różnica między tymi dwoma?socket.emit() vs. socket.send()

Zauważyłem, że jeśli zmieniłem z socket.emit na socket.send w programie roboczym, serwer nie odebrał wiadomości, chociaż nie rozumiem dlaczego.

Zauważyłem również, że w moim programie, jeśli zmieniłem z socket.emit na socket.send, serwer odbiera wiadomość, ale wydaje się, że otrzymuje ją wiele razy. Kiedy używam console.log(), aby zobaczyć, co otrzymał serwer, pokazuje coś innego niż kiedy używam socket.emit.

Dlaczego to zachowanie? Skąd wiadomo, kiedy należy używać socket.emit lub socket.send?

Odpowiedz

92

Z socket.emit można zarejestrować niestandardowe zdarzenie tak:

server:

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

klient:

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

Socket.send robi to samo, ale nie Zarejestruj się w "news", ale na wiadomość:

serwer:

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

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

klient:

var socket = io.connect('http://localhost'); 
socket.on('message', function (message) { 
    console.log(message); 
}); 
+2

To nie wydaje się wielką różnicą. Widzi, że socket.on() może zrobić wszystko, co może zrobić socket.on(). Dlaczego musieli wykonać tę funkcję? –

+2

Nie wiem, sprawdziłem kod źródłowy i są prawie takie same (https://github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318). Może to historyczne i tylko z myślą o kompatybilności wstecznej. – Charles

+1

Tworzenie przez socket.io funkcji emit() robi coś innego niż to, co emituje funkcja EventEmitter(), czyż nie? Jest to protokół na szczycie surowych pseudosockets, które wychodzą jako nazwane zdarzenia po drugiej stronie, zamiast nieprzetworzonych wiadomości. Pozwala używać jednego gniazda dla wielu strumieni, w pewnym sensie, zwielokrotniając je. – aredridel

20

socket.send realizowany jest pod kątem zgodności z interfejsem wanilia websocket. socket.emit jest funkcją tylko gniazda Socket.IO. Oba robią to samo, ale socket.emit jest nieco bardziej wygodny w obsłudze wiadomości.

+0

socket.emit nie jest ograniczony do Socket.IO, ale działa również w sieci. – ajay

54

prosty i precyzyjny (Źródło: Socket.IO google group):

socket.emit pozwala emitować niestandardowych zdarzeń na serwerze i kliencie

socket.send wysyła wiadomości, które są odbierane ze zdarzeniem

38

TL 'message'; DR :

socket.send(data, callback) jest zasadniczo równoważne z wywoływaniem socket.emit('message', JSON.stringify(data), callback)

Nie patrząc na kod źródłowy, zakładam, że funkcja wysyłania jest bardziej wydajna edytuj: do wysyłania wiadomości tekstowych, co najmniej?

Tak więc w zasadzie emituje pozwala wysyłać obiekty, co jest bardzo przydatne.

Weźmy ten przykład z socket.emit:

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

i dla tych, utrzymując wynik w domu, oto jak to wygląda przy użyciu socket.send:

sendMessage: function(type, message) { 
    socket.send(JSON.stringify({ 
     type: type, 
     message: message 
    })); 
} 
0

W podstawowych dwóch systemów komunikacyjnych sposób gniazdo.emit okazał się bardziej przekonujący i łatwy w użyciu (osobiste doświadczenie) i jest częścią Socket.IO, który jest przede wszystkim zbudowany do takich celów.