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.
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
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