Differenze tra socket.io e websocket


459

Quali sono le differenze tra socket.io e websocket in node.js?
Sono entrambe tecnologie push server? Le uniche differenze che ho sentito è stata,

  1. socket.io mi ha permesso di inviare / emettere messaggi specificando un nome di evento.

  2. Nel caso di socket.io un messaggio dal server raggiungerà tutti i client, ma per lo stesso nei websocket sono stato costretto a mantenere un array di tutte le connessioni e ad attraversarlo per inviare messaggi a tutti i client.

Inoltre, mi chiedo perché gli ispettori web (come Chrome / firebug / fiddler) non siano in grado di catturare questi messaggi (da socket.io/websocket) dal server?

Si prega di chiarire questo.


6
Per quanto riguarda il motivo per cui gli ispettori Web non catturano il traffico: vedi Come visualizzare il contenuto della richiesta WebSocket WS / WSS utilizzando Firebug o altro?
treaz,

1
@treaz non hai bisogno di Firebug o altro. Gli sviluppatori di Chrome mostrano le connessioni WS nella scheda Reti.

Controlla anche questo (non sono sicuro se questo è l'ultimo) - educba.com/websocket-vs-socket-io
Manohar Reddy Poreddy

Risposte:


326

I suoi vantaggi sono che semplifica l'utilizzo di WebSocket come descritto nel n. 2, e probabilmente ancora più importante fornisce failover ad altri protocolli nel caso in cui WebSocket non sia supportato sul browser o sul server. Eviterei di utilizzare WebSocket direttamente se non si ha molta familiarità con gli ambienti in cui non funzionano e non si è in grado di aggirare tali limiti.

Questa è una buona lettura sia su WebSocket che su Socket.IO.

http://davidwalsh.name/websocket


63
Socket.IO non è basato su WebSocket, ma utilizza questa tecnologia solo quando è disponibile.
moka,

24
Differenza semantica e l'ho spiegato nel resto della risposta, ma ho aggiornato la risposta per riflettere questo.
Timothy Strimple,

1
@moka, dalle tue parole posso concludere che la seguente affermazione è sbagliata? Socket.IO è in realtà più di un livello su WebSocket.
Pulak Kanti Bhattacharyya

3
@PulakKantiBhattacharyya potresti specificare a quale affermazione ti riferisci esattamente? Socket.IO è molto più di un semplice livello sopra WebSocket, ha una semantica diversa (contrassegna i messaggi con il nome) e esegue il failover su protocolli diversi, oltre a un meccanismo straziante. Altro che collega ID ai client sul lato server e altro ancora. Quindi non è solo un wrapper, è una libreria completa. In effetti non è stato supportato bene negli ultimi anni, quindi consiglierei di utilizzare SockJS che è un'alternativa molto migliore e più mantenuta a Socket.IO.
moka,

4
@moka Un mese fa avrei concordato con te. Socket.io 1.0 è ora disponibile e sta ricevendo aggiornamenti.
Timothy Strimple,

538

fraintendimenti

Esistono alcuni malintesi comuni riguardo a WebSocket e Socket.IO:

  1. Il primo malinteso è che l'uso di Socket.IO è significativamente più semplice rispetto all'utilizzo di WebSocket che non sembra essere il caso. Vedi esempi di seguito.

  2. Il secondo malinteso è che WebSocket non è ampiamente supportato nei browser. Vedi sotto per maggiori informazioni.

  3. Il terzo malinteso è che Socket.IO esegue il downgrade della connessione come fallback su browser meno recenti. Presuppone in realtà che il browser sia vecchio e avvia una connessione AJAX al server, che viene successivamente aggiornato sui browser che supportano WebSocket, dopo uno scambio di traffico. Vedi sotto per i dettagli.

Il mio esperimento

Ho scritto un modulo npm per dimostrare la differenza tra WebSocket e Socket.IO:

È un semplice esempio di codice lato server e lato client: il client si connette al server utilizzando WebSocket o Socket.IO e il server invia tre messaggi a intervalli di 1, che vengono aggiunti al DOM dal client.

Lato server

Confronta l'esempio sul lato server dell'utilizzo di WebSocket e Socket.IO per fare lo stesso in un'app Express.js:

Server WebSocket

Esempio di server WebSocket utilizzando Express.js:

var path = require('path');
var app = require('express')();
var ws = require('express-ws')(app);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'ws.html'));
});
app.ws('/', (s, req) => {
  console.error('websocket connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.send('message from server', ()=>{}), 1000*t);
});
app.listen(3001, () => console.error('listening on http://localhost:3001/'));
console.error('websocket example');

Fonte: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js

Server Socket.IO

Esempio di server Socket.IO utilizzando Express.js:

var path = require('path');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'si.html'));
});
io.on('connection', s => {
  console.error('socket.io connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.emit('message', 'message from server'), 1000*t);
});
http.listen(3002, () => console.error('listening on http://localhost:3002/'));
console.error('socket.io example');

Fonte: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js

Dalla parte del cliente

Confronta l'esempio sul lato client dell'utilizzo di WebSocket e Socket.IO per fare lo stesso nel browser:

Client WebSocket

Esempio di client WebSocket utilizzando JavaScript vanilla:

var l = document.getElementById('l');
var log = function (m) {
    var i = document.createElement('li');
    i.innerText = new Date().toISOString()+' '+m;
    l.appendChild(i);
}
log('opening websocket connection');
var s = new WebSocket('ws://'+window.location.host+'/');
s.addEventListener('error', function (m) { log("error"); });
s.addEventListener('open', function (m) { log("websocket connection open"); });
s.addEventListener('message', function (m) { log(m.data); });

Fonte: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html

Client Socket.IO

Esempio di client Socket.IO utilizzando JavaScript vanilla:

var l = document.getElementById('l');
var log = function (m) {
    var i = document.createElement('li');
    i.innerText = new Date().toISOString()+' '+m;
    l.appendChild(i);
}
log('opening socket.io connection');
var s = io();
s.on('connect_error', function (m) { log("error"); });
s.on('connect', function (m) { log("socket.io connection open"); });
s.on('message', function (m) { log(m); });

Fonte: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html

Traffico di rete

Per vedere la differenza nel traffico di rete puoi eseguire il mio test . Ecco i risultati che ho ottenuto:

Risultati WebSocket

2 richieste, 1.50 KB, 0,05 s

Da quelle 2 richieste:

  1. Pagina HTML stessa
  2. aggiornamento della connessione a WebSocket

(La richiesta di aggiornamento della connessione è visibile sugli strumenti di sviluppo con una risposta 101 Protocolli di commutazione.)

Risultati Socket.IO

6 richieste, 181.56 KB, 0.25 s

Da quelle 6 richieste:

  1. la stessa pagina HTML
  2. JavaScript di Socket.IO (180 kilobyte)
  3. prima richiesta AJAX di polling lungo
  4. seconda richiesta AJAX di polling lungo
  5. terza richiesta AJAX di polling lungo
  6. aggiornamento della connessione a WebSocket

Screenshots

Risultati di WebSocket che ho ottenuto su localhost:

Risultati WebSocket - modulo websocket-vs-socket.io

Risultati di Socket.IO che ho ottenuto su localhost:

Risultati Socket.IO - modulo websocket-vs-socket.io

Mettiti alla prova

Avvio rapido:

# Install:
npm i -g websocket-vs-socket.io
# Run the server:
websocket-vs-socket.io

Apri http: // localhost: 3001 / nel tuo browser, apri gli strumenti di sviluppo con Maiusc + Ctrl + I, apri la scheda Rete e ricarica la pagina con Ctrl + R per vedere il traffico di rete per la versione di WebSocket.

Apri http: // localhost: 3002 / nel tuo browser, apri gli strumenti per sviluppatori con Maiusc + Ctrl + I, apri la scheda Rete e ricarica la pagina con Ctrl + R per vedere il traffico di rete per la versione Socket.IO.

Per disinstallare:

# Uninstall:
npm rm -g websocket-vs-socket.io

Compatibilità del browser

A partire da giugno 2016 WebSocket funziona su tutto tranne Opera Mini, incluso IE superiore a 9.

Questa è la compatibilità del browser di WebSocket su Posso usare da giugno 2016:

inserisci qui la descrizione dell'immagine

Vedi http://caniuse.com/websocket per informazioni aggiornate.


23
Quindi in pratica quello che stai dicendo è che websocket è meglio di socket.io?
Jack Moscovi,

42
@JackMoscovi Non direi che WebSocket sia necessariamente migliore. Tutto dipende dai requisiti. I vantaggi di WebSocket sono che è uno standard Web (prima sotto W3C e whatwg, ora sotto IETF, con una RFC pubblicata 5 anni fa), è molto leggero perché è supportato nativamente dai browser, ma il supporto del browser pur essendo buono è non universale. Socket.IO supporta più browser e ha più funzionalità, ma ha anche un certo sovraccarico. A volte uno è meglio, a volte l'altro. È come scegliere tra querySelectorAll e jQuery - la risposta non è sempre la stessa
rsp

20
Ottima risposta qui !! Mi sembra che socket.io non sia più necessario in molti casi ... Vedi anche questo fantastico articolo! medium.com/@ivanderbyl/…
Alvaro

4
@rsp Non credo che questi esempi siano funzionalmente equivalenti? Socket-io gestisce cose come la riconnessione automatica quando viene interrotta (cosa che accade sui dispositivi mobili) e penso che ci siano problemi di sicurezza attorno a ciò che viene gestito per te? I tuoi semplici esempi WS, sebbene funzionalmente equivalenti, non hanno queste proprietà.
mindplay.dk,

28
Ottimo confronto. Tuttavia, vale la pena notare che Socket.io aggiunge la spaziatura del nome della stanza, tonnellate di dettagli di connessione, molti dettagli di registrazione e ci sono molte librerie di integrazione per Socket.IO con Angular, Vue, React e altri. Ancora più importante, è possibile disabilitare il polling lungo Ajax e connettersi direttamente tramite WebSocket proprio come una connessione WebSocket non elaborata. In questo modo, ottieni tutto tranne la libreria 180kb come uguale. L'uso diretto di WebSocket è doloroso a meno che non sia necessario il minimo indispensabile. Lasciare le stanze e accedere all'IP della comunità è scoraggiante per le imprese.
Nick Steele,

30

Ho intenzione di fornire un argomento contro l'utilizzo di socket.io.

Penso che usare socket.io solo perché ha fallback non è una buona idea. Lascia che IE8 RIP.

In passato ci sono stati molti casi in cui le nuove versioni di NodeJS hanno rotto socket.io. È possibile controllare questi elenchi per esempi ... https://github.com/socketio/socket.io/issues?q=install+error

Se vai a sviluppare un'app Android o qualcosa che deve funzionare con la tua app esistente, probabilmente starai bene lavorando subito con WS, socket.io potrebbe darti qualche problema lì ...

Inoltre il modulo WS per Node.JS è incredibilmente semplice da usare.


cosa suggerisci che utilizziamo per interagire con mysql -> express.js / fastify.js o node.js direttamente ... per creare app di chat per android e ios
DragonFire

25

Usare Socket.IO è fondamentalmente come usare jQuery: vuoi supportare i browser più vecchi, devi scrivere meno codice e la libreria fornirà fallback. Socket.io utilizza la tecnologia websocket se disponibile e, in caso contrario, controlla il miglior tipo di comunicazione disponibile e lo utilizza.


3

Anche se i browser moderni supportano WebSocket ora, penso che non sia necessario buttare via SocketIO e che abbia ancora il suo posto in qualsiasi progetto al giorno d'oggi. È facile da capire e personalmente ho imparato come funzionano i WebSocket grazie a SocketIO.

Come detto in questo argomento, ci sono molte librerie di integrazione per Angular, React, ecc. E tipi di definizione per TypeScript e altri linguaggi di programmazione.

L'altro punto che aggiungerei alle differenze tra Socket.io e WebSocket è che il clustering con Socket.io non è un grosso problema. Socket.io offre adattatori che possono essere utilizzati per collegarlo a Redis per migliorare la scalabilità. Hai ioredis e socket.io-redis per esempio.

Sì, lo so, esiste SocketCluster , ma è fuori tema.


2

Socket.IO utilizza WebSocket e quando WebSocket non è disponibile utilizza l'algo di fallback per effettuare connessioni in tempo reale.


0

https://socket.io/docs/#What-Socket-IO-is-not (con la mia enfasi )

Cosa non è Socket.IO

Socket.IO NON è un'implementazione WebSocket. Sebbene Socket.IO utilizzi effettivamente WebSocket come mezzo di trasporto quando possibile, aggiunge alcuni metadati a ciascun pacchetto: il tipo di pacchetto, lo spazio dei nomi e l'id del pacchetto quando è necessario un riconoscimento del messaggio. È per questo che un cliente WebSocket sarà non essere in grado di connettersi a un server Socket.IO , e un cliente Socket.IO sarà non essere in grado di connettersi a un server WebSocket sia. Si prega di consultare le specifiche del protocollo qui .

// WARNING: the client will NOT be able to connect!
const client = io('ws://echo.websocket.org');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.