Sto usando il modulo nodejs + websocket per stabilire una connessione tra il client e il server attraverso una websocket. Il server emette più volte dati al client: so che è una connessione TCP, ma lascia che cancelli ogni dubbio a 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 emettitore non viene ancora ricevuto e il secondo viene emesso? Sono emette il blocco delle chiamate?Websocket: i dati del server vengono inviati in modo sincrono?
risposta
WebSockets è basato su TCP. TCP garantisce la consegna e l'ordine dei pacchetti. Inoltre, a differenza di 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 sono chiamati dallo stesso contesto (la stessa funzione) uno dopo l'altro saranno consegnati in questo 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.
Aggiornamento:
Ecco un esempio di espandere sul motivo per cui la natura guidata caso di Node.js può provocare sorprendente riordino delle WebSocket emette/invia:
fs.readFile(file1,function(e,data) { ws.send(data); });
fs.readFile(file2,function(e,data) { ws.send(data); });
L'ordine che 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 verranno 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 avvenire nell'ordine aspettarsi.
La natura asincrona basata sugli 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.
"Tuttavia, se le emette sono in due richiami diversi, non è sempre possibile garantire quando Node.js pianificherà tali richiamate e quindi le emette potrebbero essere riordinate perché i callback pianificati sono stati riordinati." - se la richiamata 1 ha funzionato prima della richiamata 2, ed entrambe emettono, l'emit * di callback * verrà eseguito prima dell'emissione di callback 2. – einaros
@einaros, è vero, ma il mio punto è che i callback sono intrinsecamente asincroni, quindi non puoi garantire l'ordine in cui sparano. Anche se si registra la richiamata A 1 secondo prima di registrare la richiamata B, se la routine con callback A richiede 3 secondi per completare e B impiega solo 1 secondo, allora B avverrà prima di A anche se A è stato registrato per primo. E ogni callback che sta sparando sul completamento dell'I/O avrà spesso tempi imprevedibili. – kanaka
Dato che le richiamate registrate in un ordine specifico per un evento specifico verranno sempre eseguite in tale ordine, non vedo come il resto si riferisca alla domanda dell'OP. È ovvio che se gli eventi che attivano le emesse cambiano ordine; le emette cambieranno anche ordine. – einaros
- 1. Android, Webview, vengono inviati i dati del modulo
- 2. Dove vengono memorizzati i dati inviati da UDP?
- 3. È possibile caricare in modo sincrono i dati da Firebase?
- 4. Server Websocket con PHP
- 5. Come leggere i dati HttpRequest inviati dal client, sul server
- 6. Salvataggio dei dati del modello Backbone.js. Dati non inviati correttamente
- 7. la comunicazione tra i server websocket
- 8. Se i dati jQuery AJAX vengono inviati/ricevuti, è possibile ricevere solo alcuni dei dati?
- 9. In che modo vengono archiviati i dati in * .npy?
- 10. come limitare la quantità di dati inviati dal client tramite websocket?
- 11. Controllo del modo in cui i dati del test vengono generati in QuickCheck
- 12. Come includere i dati JSON in javascript in modo sincrono senza analisi?
- 13. Come generare un'eccezione quando vengono inviati parametri non inviati?
- 14. I pacchetti RTP non vengono inviati o ricevuti utilizzando mjsip
- 15. Soluzione moderna per i server WebSocket?
- 16. Eseguire GC.Collect in modo sincrono
- 17. Perché i valori predefiniti non vengono inviati con UseMethod?
- 18. document.createElement ("script") in modo sincrono
- 19. Websocket tra 2 server?
- 20. Streaming server e eventi inviati
- 21. Server Websocket PHP hybi10
- 22. Cookie non inviati nell'app di Windows Phone, ma i cookie vengono inviati con lo stesso codice nell'app di Windows 8
- 23. Come vengono memorizzati i dati in lucene
- 24. PHP: determina quanti byte vengono inviati tramite http
- 25. PHP Riscrivi l'url e conserva i dati inviati
- 26. Come accedere ai dati inviati al mio server utilizzando BaseHTTPRequestHandler?
- 27. Server WebSocket in PHP senza demoni?
- 28. I gestori eventi vengono elaborati in modo asincrono?
- 29. I dati crittografati RSA possono essere inviati tramite HTTP?
- 30. funzione send() in C come gestire se non vengono inviati tutti i byte?
http://stackoverflow.com/q/11804721/632951 – Pacerier