Websocket: i dati del server vengono inviati in modo sincrono?

Sto usando nodejs + modulo websocket per stabilire una connessione tra il client e il server attraverso un websocket. Il server emette più volte dati al client: so che è una connessione TCP, ma lascia che cancelli ogni dubbio al riguardo. Le “emette” sono sequenziali? Se il primo “emit” è stato fatto al tempo 1s e il secondo “emit” al tempo 2s, il client riceverà di sicuro il primo emit e poi il secondo? Cosa succede se il primo emit non viene ancora ricevuto e il secondo viene emesso? Sono emette il blocco delle chiamate?

WebSockets è costruito su TCP. TCP garantisce la consegna e l’ordine dei pacchetti. Inoltre, a differenza del protocollo TCP, WebSockets è basato sui messaggi, il che significa che i messaggi WebSocket vengono ricevuti come un intero messaggio (TCP è in streaming e “i messaggi” potrebbero essere frammentati dal punto di vista dell’ascoltatore)

In node.js, due emetti che vengono chiamati dallo stesso contesto (la stessa funzione) uno dopo l’altro verranno consegnati in tale ordine. Tuttavia, se le tue emette sono in due richiami diversi, non puoi sempre garantire quando Node.js pianificherà tali callback e quindi le emette potrebbero essere riordinate perché i callback pianificati sono stati riordinati.

Aggiornare:

Ecco un esempio per espandere il motivo per cui la natura guidata da eventi di Node.js può risultare in un sorprendente re-ordering di emetti / mandi di WebSocket:

fs.readFile(file1,function(e,data) { ws.send(data); }); fs.readFile(file2,function(e,data) { ws.send(data); }); 

L’ordine con cui file1 e file2 verranno consegnati al browser non è prevedibile (anche la dimensione del file non è una garanzia di quando spareranno a causa di cose come la memorizzazione nella cache, la frammentazione del file system, ecc.). Anche se il file di lettura di file2 viene chiamato dopo 1 secondo utilizzando un setTimeout, il browser potrebbe ancora riceverli fuori ordine (ad esempio se file1 è molto più grande e richiede 3 secondi per leggere l’invio di file1 avverrà dopo l’invio per file2) .

Quindi sì, le emittenze / le mandate saranno ricevute nel browser nell’ordine in cui sono chiamate in Node.js, ma a causa della natura asincrona degli eventi di Node.js, le emittenze / le mandate potrebbero non accadere nell’ordine che ci si aspetta.

La natura asincrona degli eventi di Node.js è ciò che fornisce a Node.js un’eccellente efficienza e prestazioni, ma se non si è abituati a questo tipo di programmazione basata sul callback, può avere risultati sorprendenti.

I messaggi arrivano al cliente nell’ordine corretto.