2013-08-15 6 views
6

Wenn ich eine große Blob oder ArrayBuffer über ein JavaScript über seine send Methode senden ... ruft die Methode send Block, bis die Daten gesendet werden, oder macht es eine Kopie der Daten asynchron so den Aufruf zu senden Kann sofort zurückkehren?Blockiert die JavaScript WebSocket.send-Methode?

Eine verwandte (offen) Frage ist, aus, wie ich es interpretieren, ob eine schnelle Abfolge von onmessage Ereignisse verzögert werden verursacht sendet, wie jemand in Mobile Safari geschieht beschrieben scheint: Apparent blocking behaviour in JavaScript websocket on mobile Safari

Antwort

3

Basierend auf die Beschreibung des bufferedAmount Attribut, habe ich abgeleitet, dass send sofort zurückgeben muss, weil sonst bufferedAmount immer Null sein würde. Wenn es nicht Null ist, dann müssen Daten von einem vorherigen zu sendenden Aufruf gepuffert sein, und wenn Daten gepuffert werden, gibt es keinen Grund dafür, dass sie blockieren.

Von http://dev.w3.org/html5/websockets/

Das bufferedAmount Attribut muss die Anzahl der Bytes von Anwendungsdaten zurück (UTF-8-Text und binäre Daten), die Verwendung send() sondern dass die Warteschlange gestellt worden sind, beim letzten Start der Ereignisschleife wurde eine Task ausgeführt, die noch nicht an das Netzwerk übertragen wurde. (Dieser enthält also jeden Text, der während der Ausführung der aktuellen Aufgabe gesendet wird, , unabhängig davon, ob der Benutzeragent den Text asynchron mit der Ausführung des Skripts übertragen kann.) Dies schließt nicht den durch das Protokoll verursachten Rahmen Overhead ein durch das Betriebssystem System oder Netzwerk-Hardware. Wenn die Verbindung geschlossen wird, wird dieser Wert des Attributs nur bei jedem Aufruf der Methode send() (die Nummer wird nicht auf Null zurückgesetzt, sobald die Verbindung geschlossen wird).

In diesem einfachen Beispiel, das bufferedAmount wird Attribut verwendet , um sicherzustellen, dass Updates wird alle 50ms entweder mit einer Rate von einem Update gesendet, wenn das Netzwerk dieser Rate verarbeiten kann, oder was auch immer Rate das Netzwerk kann handle, wenn das zu schnell ist.

var socket = new WebSocket('ws://game.example.com:12010/updates'); 
socket.onopen = function() { 
    setInterval(function() { 
     if (socket.bufferedAmount == 0) 
      socket.send(getUpdateData()); 
    }, 50); 
}; 

Die bufferedAmount Attribut kann auch das Netzwerk zu sättigen verwendet werden , ohne die Daten mit einer höheren Rate zu senden, als das Netzwerk verarbeiten kann, obwohl dies eine sorgfältige Überwachung des Wertes erfordert das Attribut im Laufe der Zeit.

+0

Ich werde sehen, wie viele Stimmen, wenn überhaupt, diese Antwort bekommt. Es scheint, dass Senden im Allgemeinen logischerweise keinen Grund hat, zu blockieren, aber ich habe keine Ahnung, wie es sich mit sehr großen Blobs oder ArrayBuffern verhalten wird, wenn es zum Beispiel einen maximal erlaubten gepufferten Betrag überschreiten würde. Die Spezifikation besagt, dass der Benutzeragent den Websocket mit Vorurteilen schließen muss, wenn send aufgerufen wird und der Puffer voll ist. – Triynko

+1

Scheint, dass es in einigen Implementierungen eine Grenze von 2GB gibt: "So möchten wir vielleicht in unseren Dokumenten erwähnen, dass wir derzeit bis zu 2 GB Web Socket-Nachrichten sowohl eingehend als auch abgehend unterstützen.Das ist die theoretische Grenze - malloc ist sicher, auf Mobilgeräten für solche Größen zu scheitern, in welchem ​​Fall (wie spezifiziert) der Websocket fehlgeschlagen ist. "- https://bugzilla.mozilla.org/show_bug.cgi?id=711003 – Triynko

Verwandte Themen