2013-12-18 29 views
7

JSONデータの大量のチャンクをWebソケット経由で送信しています。 JSONには1000以上のエントリがあります。フレームサイズの制限により、Websocketプロトコルは自動的にJSONをフレームに分割します。フレームはサポートされません。ウェブソケットのフレームサイズは変更できません。Websocketフレームサイズの制限

問題:私はJSON.parseを使用して、私のJSONを評価しようとすると

それは私のフレームは、完全なJSONオブジェクトではありませんので、明らかである構文解析エラーが発生します。このすべては、Websocket onmessageイベントコールバックで発生します。異なるフレームで巨大なJSONを受け取ってもそれを解析するにはどうしたらいいですか? onmessageのフレームを連結しようとしましたが、それでもエラーは解決しません。

サイド質問:

がどのように壊れたJSONを適切にconcatinateするには?

+0

サイドの答え:ために、任意の塊を除外せずに... – Eloff

+0

この上の任意の解像度?私は同じ問題に直面しています。 –

+0

このリストのバッファサイズのパラメータをweb.xmlに追加します https://github.com/Atmosphere/atmosphere/blob/master/modules/cpr/src/main/java/org/atmosphere/cpr/ApplicationConfig.java –

答えて

15

単一のWebSocketフレームは、RFC-6455 base framing当たり、ただしからなるのWebSocketメッセージを、2^63バイト(9,223,372,036,854,775,807バイト〜= 9.22エクサバイト)@Sebastianによる補正)

の最大サイズ制限を有しています1以上のフレームは、プロトコルレベルからそれに課される制限がない。

各WebSocket実装は、メッセージとフレームの制限を別々に処理します。メッセージ全体の最大メッセージサイズを設定する(通常はメモリ消費の理由から)、または大きなメッセージのストリーミングオプションを提供してメモリをより有効に活用するなど。

あなたのケースでは、選択したWebSocket実装にバグがあり、複数のフレームではなく複数のメッセージにJSONメッセージを不適切に分割している可能性があります。 Chromeのネットワーク検査ツールやWiresharkなどの外部ツールを使用して、この動作を確認できます。

+2

複数のメッセージでJSONを分割していないため、複数のフレームに分割されています。私はそれが知っているのは、私がChromeツールを使って検査したからです。私はそれをどのように扱うのですか?私はAtmosphere Frameworkを使用しています。 –

+0

websocketのバッファサイズを変更しようとしましたか? Atmosphereメーリングリストについて議論してみましょう。しかし、サーバのWebSocketバッファサイズを増やす必要があるとの疑いがあります。 – jfarcand

1

低レベルのWSを扱っているので、複数のWSフレームにわたって送信されるデータを扱うアプリケーションプロトコルを作成する必要があります。各WSフレーム(btw、フレームを連結しないで各フレームのデータを連結する)にあるデータを連結するのはあなた次第です。

基本的には、ファイル転送プロトコルを改革しています。

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

変更デフォルトmaxFrameSize & MESSAGESIZE