2013-08-15 12 views
6

Jeśli wysyłam dużą wartość Blob lub ArrayBuffer przez JavaScript WebSocket za pomocą jej metody send ... wykonuje blok wywołania metody send do momentu wysłania danych lub robi kopię danych do wysłania asynchronicznie, aby wywołanie może natychmiast wrócić?Czy blokuje się metoda JavaScript WebSocket.send?

Podobnym (bez odpowiedzi) Pytanie jest, od tego, jak interpretować to, czy szybka seria wysyła spowoduje onmessage imprezy będzie opóźniony, jak ktoś wydaje opisali dzieje w Mobile Safari: Apparent blocking behaviour in JavaScript websocket on mobile Safari

Odpowiedz

3

podstawie opis atrybutu w bufferedAmount, mam wydedukować, że send musi powrócić natychmiast, bo inaczej bufferedAmount zawsze będzie zero. Jeśli wartość jest różna od zera, muszą istnieć dane buforowane z wcześniejszego połączenia, a jeśli wysyła dane buforów, nie ma powodu, aby je blokować.

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

bufferedAmount atrybut musi zwracać liczbę bajtów danych aplikacji (UTF-8 tekstu i danych binarnych), które zostały kolejce korzystających send() ale że od ostatniego uruchomienia pętli zdarzeń wykonanie zadania nie zostało jeszcze przesłane do sieci. (Ten numer obejmuje zatem dowolny tekst wysłany podczas wykonywania bieżącego zadania, , niezależnie od tego, czy agent użytkownika jest w stanie przesłać tekst w postaci asynchronicznie za pomocą wykonania skryptu.) Nie obejmuje to kadrowania narzutów generowanych przez protokół ani buforowania wykonanego przez działający system lub sprzęt sieciowy. Jeśli połączenie zostanie zamknięte, wartość atrybutu wzrośnie tylko wraz z każdym wywołaniem metody (numer ten nie zostanie zresetowany do zera po zamknięciu połączenia).

W tym prostym przykładzie, atrybut bufferedAmount służy do zapewnienia że aktualizacje są wysyłane zarówno w tempie jednej aktualizacji co 50ms, jeśli sieć może obsłużyć tej stopy lub na dowolnym tempie sieć może uchwyt, jeśli to zbyt szybko.

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

bufferedAmount atrybut może być również używany do nasycenia sieci bez wysyłania danych na poziomie wyższym niż sieć może obsłużyć, choć wymaga to bardziej staranne monitorowanie wartości atrybut w czasie.

+0

Zobaczę, ile głosów, jeśli w ogóle, otrzyma tę odpowiedź. Wydaje się, że logicznie, wysyłanie na ogół nie miałoby powodu do blokowania, ale nie mam pojęcia, jak będzie się zachowywać z bardzo dużymi blokami Blobów lub ArrayBuffers, na przykład jeśli przekroczy maksymalną dozwoloną ilość buforowaną. Specyfikacja mówi, że agent użytkownika musi zamknąć websocket z uprzedzeniami, jeśli wywołanie jest wywoływane, a bufor jest pełny. – Triynko

+1

Wygląda na to, że w niektórych implementacjach obowiązuje limit 2 GB: "Możemy więc chcieć wspomnieć w naszych dokumentach, że obecnie obsługujemy do 2 GB wiadomości Web Socket, zarówno przychodzących/wychodzących.To teoretyczny limit - malloc z pewnością zawiedzie na urządzeniach mobilnych dla takich rozmiarów, w którym to przypadku (zgodnie z mandatem) websocket nie działa. "- https://bugzilla.mozilla.org/show_bug.cgi?id=711003 – Triynko

Powiązane problemy