Websocket: Werden Serverdaten synchron gesendet?

8

Ich verwende nodejs + websocket-Modul, um eine Verbindung zwischen dem Client und dem Server über einen Websocket herzustellen. Der Server sendet mehrmals Daten an den Client: Ich weiß, dass es eine TCP-Verbindung ist, aber lasst mich jeden Zweifel daran löschen. Sind die "emittiert" sequenziell? Wenn der erste "emit" zum Zeitpunkt 1s und der zweite "emit" zum Zeitpunkt 2s gemacht wurde, wird der Client sicher den ersten und dann den zweiten emittieren? Was passiert, wenn die erste Emission noch nicht empfangen wurde und die zweite emittiert wird? Gibt es blockierende Anrufe?

    
Damiano Barbati 14.02.2012, 19:21
quelle

2 Antworten

21

WebSockets basiert auf TCP. TCP garantiert die Zustellung und Bestellung von Paketen. Darüber hinaus ist WebSockets im Gegensatz zu TCP nachrichtenbasiert, was bedeutet, dass WebSocket-Nachrichten als ganze Nachricht empfangen werden (TCP streamt und Nachrichten können aus der Perspektive des Hörers fragmentiert werden)

In node.js werden zwei, die aus demselben Kontext (dieselbe Funktion) nacheinander aufgerufen werden, in dieser Reihenfolge ausgegeben. Wenn Sie jedoch zwei verschiedene Callbacks senden, können Sie nicht immer garantieren, dass Node.js diese Callbacks einplanen wird. Die Sends können daher neu geordnet werden, da die geplanten Callbacks neu geordnet wurden.

Aktualisierung:

Hier ist ein Beispiel, um zu erläutern, warum die ereignisgesteuerte Natur von Node.js zu einer überraschenden Neuordnung von WebSocket emitts / sends führen kann:

%Vor%

Die Reihenfolge, in der file1 und file2 an den Browser geliefert werden, ist nicht vorhersehbar (selbst die Dateigröße ist keine Garantie dafür, wann sie aufgrund von Caching, Dateisystemfragmentierung usw. ausgelöst werden). Auch wenn die readFile von Datei2 eine Sekunde später mit einem setTimeout aufgerufen wird, kann der Browser sie trotzdem in der falschen Reihenfolge empfangen (zB wenn Datei1 viel größer ist und 3s zum Einlesen benötigt, dann wird der Sendevorgang von Datei1 nach dem Senden für Datei2 passieren) .

Ja, emays / sends werden im Browser in der Reihenfolge empfangen, in der sie in Node.js aufgerufen werden, aber aufgrund der asynchronen ereignisgesteuerten Natur von Node.js können die emitts / sends nicht in der von Ihnen erwarteten Reihenfolge passieren .

Die asynchrone ereignisgesteuerte Natur von Node.js verleiht Node.js eine ausgezeichnete Effizienz und Leistung, aber wenn Sie diese Art von Callback-basierter Programmierung nicht gewohnt sind, kann dies zu überraschenden Ergebnissen führen.

    
kanaka 14.02.2012, 19:46
quelle
4

Nachrichten kommen beim Client in der richtigen Reihenfolge ein.

    
thejh 14.02.2012 19:29
quelle

Tags und Links