2013-12-18 4 views
7

Ich sende riesige Stücke von JSON-Daten über Websockets. Der JSON kann über 1000 Einträge haben. Aufgrund der Rahmengrößenbeschränkung teilt das Websocket-Protokoll den JSON automatisch in Frames auf, denen nicht geholfen werden kann. Da wir die Rahmengröße von Websockets nicht ändern können.Websocket Rahmengrößenbeschränkung

Das Problem:

Wenn ich versuche, meine JSON zu bewerten JSON.parse verwende es gibt mir einen Parsing-Fehler, die da offensichtlich ist, der Rahmen nicht vollständig JSON-Objekte sind. All dies geschieht im Websocket onmessage Event Callback. Wie kann ich den riesigen JSON in verschiedenen Frames erhalten und trotzdem parsen? Ich habe versucht, die Rahmen in onmessage concaat immer noch den Fehler besteht.

Side Frage:

Wie man richtig ein gebrochenes JSON concatinate?

+0

Side Antwort: in Ordnung, ohne irgendwelche Brocken Weglassen ... – Eloff

+0

Jeder Beschluss dazu? Ich stehe vor demselben Problem. –

+0

Fügen Sie die Puffergrößenparameter aus dieser Liste in Ihre web.xml https://github.com/Atmosphere/atmosphere/blob/master/modules/cpr/src/main/java/org/atmosphere/cpr/ApplicationConfig.java ein –

Antwort

15

Ein einzelner WebSocket Rahmen pro RFC-6455 base framing, hat eine maximale Größe von 2^63 Bytes (9,223,372,036,854,775,807 Bytes ~ = 9.22 Exabyte) (Korrektur durch @Sebastian)

jedoch eine WebSocket Nachricht, bestehend aus 1 oder mehr Rahmen, hat keine Begrenzung von Protokoll-Ebene.

Jede WebSocket-Implementierung behandelt die Nachrichten- und Frame-Grenzwerte unterschiedlich. B. das Einstellen der maximalen Nachrichtengröße für die gesamte Nachricht (normalerweise aus Gründen des Speicherverbrauchs) oder das Anbieten von Streaming-Optionen für große Nachrichten, um den Speicher besser zu nutzen.

In Ihrem Fall ist es jedoch wahrscheinlich, dass die von Ihnen gewählte WebSocket-Implementierung einen Fehler aufweist und die JSON-Nachricht nicht ordnungsgemäß in mehrere Nachrichten statt in mehrere Frames aufteilt. Sie können das Tool zur Netzwerkinspektion in Chrome oder ein externes Tool wie Wireshark verwenden, um dieses Verhalten zu bestätigen.

+2

Das JSON wird nicht in mehreren Nachrichten aufgeteilt, sondern in mehrere Frames aufgeteilt. Ich weiß das nur, weil ich das Chrome-Tool inspiziert habe. Wie gehe ich damit um? Ich benutze Atmosphere Framework. –

+0

Haben Sie versucht, die Puffergröße des Websockets zu ändern? Lassen Sie uns die Diskussion auf der Atmosphere-Mailingliste führen, aber mein Verdacht ist, dass Sie die Server-Websocket-Puffergröße erhöhen müssen. – jfarcand

1

Da es sich bei WS um eine Low-Level-Version handelt, müssen Sie ein Anwendungsprotokoll erstellen, das sich mit Daten befasst, die über mehrere WS-Frames gesendet werden. Es liegt an Ihnen, die Daten, die sich in jedem WS-Rahmen befinden, zu verketten (nebenbei, fassen Sie die Rahmen nicht zusammen ... fassen Sie die Daten in jedem Rahmen zusammen).

Im Grunde erfinden Sie ein Dateiübertragungsprotokoll neu.

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

Ändern der Standard MaxFrameSize & MessageSize