Sulla base di la descrizione dell'attributo bufferedAmount
, ho dedotto che send
deve ritornare immediatamente, perché altrimenti bufferedAmount
sarebbe sempre zero. Se è diverso da zero, allora deve esserci un buffer di dati da una chiamata precedente da inviare e se i dati dei buffer di invio non hanno motivo di bloccarlo.
Da http://dev.w3.org/html5/websockets/
Il bufferedAmount attributo deve restituire il numero di byte di dati di applicazione (UTF-8 testo e dati binari) che sono stati accodati utilizzando send() ma che, a partire dall'ultima volta che il ciclo di eventi ha iniziato nell'esecuzione di un'operazione, non era ancora stato trasmesso alla rete. (Questo include quindi qualsiasi testo inviato durante l'esecuzione dell'attività corrente, indipendentemente dal fatto che l'agente utente sia in grado di trasmettere il testo in modo asincrono con l'esecuzione dello script.) Questo non include il sovraccarico dovuto al protocollo o il buffering eseguito dal sistema operativo o hardware di rete. Se la connessione è chiusa, il valore di questo attributo aumenterà solo ad ogni chiamata al metodo send() (il numero non si azzera quando la connessione si chiude).
In questo semplice esempio, l'attributo bufferedAmount è usato per assicurare che gli aggiornamenti vengono inviati sia al ritmo di un aggiornamento ogni 50 ms, se la rete in grado di gestire tale tasso, o qualsiasi tasso rete può gestire, se è troppo veloce.
var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function() {
setInterval(function() {
if (socket.bufferedAmount == 0)
socket.send(getUpdateData());
}, 50);
};
Il bufferedAmount attributo può essere utilizzato anche per saturare la rete senza inviare i dati a una velocità superiore a quella della rete in grado di gestire, anche se questo richiede più attento monitoraggio del valore di l'attributo nel tempo.
Vado a vedere quanti voti, se ce ne sono, questa risposta ottiene. Sembra che logicamente, l'invio in generale non avrebbe un motivo per bloccare, ma non ho idea di come si comporterà con Blob o ArrayBuffer molto grandi, come se dovesse superare una quantità massima di buffer consentita. La specifica dice che l'user agent deve chiudere il websocket con il pregiudizio se viene chiamato send e il buffer è pieno. – Triynko
Sembra che ci sia un limite di 2 GB in alcune implementazioni: "Quindi potremmo voler menzionare nei nostri documenti che attualmente supportiamo fino a 2 GB di messaggi Web Socket, sia in entrata che in uscita.Questo è il limite teorico - malloc è sicuro di fallire sul cellulare per tali dimensioni, nel qual caso (come richiesto dalla specifica) il websocket è fallito. "- https://bugzilla.mozilla.org/show_bug.cgi?id=711003 – Triynko