2013-12-18 14 views
7

Wysyłam olbrzymie fragmenty danych JSON przez websockets. JSON może mieć ponad 1000 wpisów. Ze względu na ograniczenia rozmiaru ramki, protokół Websocket automatycznie dzieli JSON na ramki, co nie może być pomocne. Ponieważ nie możemy zmienić rozmiaru ramek internetowych.Ograniczenie rozmiaru ramki sieciowej

Problem:

Kiedy próbuję oceniać mój JSON za pomocą JSON.parse daje mi błąd parsowania, które jest oczywiste, ponieważ ramki nie są kompletne obiekty JSON. Wszystko to dzieje się w wywołaniu zwrotnym zdarzenia Websocket onmessage. Jak mogę otrzymać ogromny JSON w różnych ramkach i nadal być w stanie go sparsować? Próbowałem połączyć ramki w onmessage nadal błąd nie ustępuje.

Side pytanie:

Jak concatinate złamaną JSON poprawnie?

+0

Side odpowiedź: w porządku, bez pozostawiania jakichkolwiek kawałki ... – Eloff

+0

dowolnej rozdzielczości na ten temat? Mam do czynienia z tym samym problemem. –

+0

Dodaj parametry wielkości bufora z tej listy do pliku web.xml https://github.com/Atmosphere/atmosphere/blob/master/modules/cpr/src/main/java/org/atmosphere/cpr/ApplicationConfig.java –

Odpowiedz

15

pojedynczej ramki websocket Per RFC-6455 base framing, ma maksymalny rozmiar 2^63 bajtów (9,223,372,036,854,775,807 bajtów ~ = 9,22 eksabajtów) (korekta przez @Sebastian)

Jednak wiadomości websocket, złożone z 1 lub więcej ramek, nie ma narzuconego limitu z poziomu protokołu.

Każda implementacja WebSocket będzie inaczej obsługiwać ograniczenia wiadomości i ramek. Takich jak ustawienie maksymalnych rozmiarów komunikatów dla całej wiadomości (zazwyczaj ze względu na zużycie pamięci) lub oferowanie opcji przesyłania strumieniowego dla dużych wiadomości w celu lepszego wykorzystania pamięci.

Ale w twoim przypadku jest prawdopodobne, że twoja wybrana implementacja WebSocket ma błąd i nieprawidłowo dzieli komunikat JSON na wiele wiadomości, zamiast wielu ramek. Możesz użyć narzędzia do sprawdzania sieci w Chrome lub zewnętrznego narzędzia takiego jak Wireshark, aby potwierdzić to zachowanie.

+2

Nie dzieli JSON na wiele wiadomości, dzieli się na wiele ramek. Wiem o tym tylko dlatego, że sprawdziłem za pomocą narzędzia Chrome. Jak sobie z tym poradzić? Używam Atmosphere Framework. –

+0

Czy próbowałeś zmienić rozmiar bufora sieciowego? Miejmy dyskusję na liście mailingowej Atmosphere, ale podejrzewam, że musisz zwiększyć rozmiar bufora websocket serwera. – jfarcand

1

Ponieważ masz do czynienia z WS, który jest niskiego poziomu, musisz utworzyć protokół aplikacji, który zajmuje się danymi wysyłanymi przez wiele ram WS. Od ciebie zależy łączenie danych znajdujących się w każdej ramce WS (btw, nie dołączaj do ramek ... łącz dane w każdej klatce).

Zasadniczo wymyślasz protokół przesyłania plików.

0
var wsServer = new websocket.server({ 
      httpServer: server, 
      maxReceivedFrameSize: 131072, 
      maxReceivedMessageSize: 10 * 1024 * 1024, 
      autoAcceptConnections: false 
     }); 

Zmień domyślne maxFrameSize & MESSAGESIZE

Powiązane problemy