2013-08-15 13 views
6

Se io mando un grande Blob o ArrayBuffer nel corso di un JavaScript WebSocket tramite il suo metodo send ... fa il blocco di chiamata send metodo fino a quando viene inviato i dati, o lo fa fare una copia dei dati da inviare in modo asincrono in modo che la chiamata può tornare immediatamente?Il blocco del metodo JavaScript WebSocket.send?

A correlato (senza risposta) domanda è, da come l'interpreto, sia una rapida serie di manda causerà eventi onMessage a essere ritardati, come qualcuno sembra aver descritto accadendo in Safari Mobile: Apparent blocking behaviour in JavaScript websocket on mobile Safari

risposta

3

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.

+0

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

+1

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

Problemi correlati