Jaka jest różnica między tymi dwoma?
Zauważyłem, że jeśli zmieniłem z socket.emit
na socket.send
w działającym programie, serwer nie otrzymał 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 otrzymuje wiadomość, ale wydaje się, że otrzymuje ją wielokrotnie. Kiedy używam, console.log()
aby zobaczyć, co otrzymał serwer, pokazuje coś innego niż wtedy, gdy używam socket.emit
.
Dlaczego to zachowanie? Skąd wiesz, kiedy użyć socket.emit
lub socket.send
?
socket.send
to, że to tylko alias dlasocket.emit('message', message);
Prosty i precyzyjny (źródło: grupa google Socket.IO ):
socket.emit
umożliwia emitowanie niestandardowych zdarzeń na serwerze i klienciesocket.send
wysyła wiadomości otrzymane wraz ze'message'
zdarzeniemźródło
TL; DR:
socket.send(data, callback)
jest zasadniczo równoważne z dzwonieniemsocket.emit('message', JSON.stringify(data), callback)
Nie patrząc na kod źródłowy, założyłbym, że funkcja wysyłania jest bardziej wydajna edycja: przynajmniej do wysyłania wiadomości tekstowych ?
Więc tak, w zasadzie emisja pozwala na wysyłanie obiektów, co jest bardzo przydatne.
Weź ten przykład z
socket.emit
:sendMessage: function(type, message) { socket.emit('message', { type: type, message: message }); }
a dla tych, którzy zapisują wyniki w domu, oto jak wygląda użycie
socket.send
:sendMessage: function(type, message) { socket.send(JSON.stringify({ type: type, message: message })); }
źródło
socket.send
jest zaimplementowany w celu zapewnienia zgodności z podstawowym interfejsem WebSocket.socket.emit
jest funkcją tylko Socket.IO. Obaj robią to samo, alesocket.emit
jest nieco wygodniejszy w obsłudze wiadomości.źródło
W podstawowych systemach komunikacji dwukierunkowej socket.emit okazał się bardziej przekonujący i łatwy w użyciu (osobiste doświadczenia) i jest częścią Socket.IO, który jest zbudowany głównie do takich celów
źródło
https://socket.io/docs/client-api/#socket-send-args-ack
socket.send
// Wysyła zdarzenie wiadomościsocket.emit(eventName[, ...args][, ack])
// możesz dostosować nazwę zdarzeniaźródło