Websocketを通じてJSONデータの巨大なチャンクを送信しています。 JSONには1000を超えるエントリが含まれる場合があります。フレームサイズの制限により、Websocketプロトコルは自動的にJSONをフレームに分割しますが、これは仕方がありません。 WebSocketのフレームサイズは変更できないため。
問題:
JSON.parse
を使用してJSONを評価しようとすると、フレームが完全なJSONオブジェクトではないため、明らかな解析エラーが発生します。これはすべて、Websocket onmessage
イベントコールバックで発生します。巨大なJSONを異なるフレームで受信し、それでも解析できるようにするにはどうすればよいですか? onmessage
のフレームを連結しようとしましたが、それでもエラーは続きます。
サイド質問:
壊れたJSONを適切に連結する方法は?
RFC-6455ベースフレーミング ごとの単一のWebSocketフレームの最大サイズ制限は2 ^ 63バイト(9,223,372,036,854,775,807バイト〜= 9.22エクサバイト)@ Sebastian )
ただし、1つ以上のフレームで構成されるWebSocketメッセージには、プロトコルレベルからの制限はありません。
各WebSocket実装は、メッセージとフレームの制限を別々に処理します。 (通常はメモリ消費の理由で)メッセージ全体の最大メッセージサイズを設定したり、メモリをより有効に使用するために大きなメッセージのストリーミングオプションを提供するなど。
しかし、あなたの場合、選択したWebSocket実装にバグがあり、JSONメッセージを複数のフレームではなく複数のメッセージに不適切に分割している可能性があります。この動作を確認するには、Chrome=またはWiresharkなどの外部ツールでネットワーク検査ツールを使用できます。
低レベルのWSを扱っているため、複数のWSフレームを介して送信されるデータを扱うアプリケーションプロトコルを作成する必要があります。各WSフレームにあるデータを連結するのはあなた次第です(ところで、フレームを連結しないでください...各フレームのデータを連結します)。
基本的に、ファイル転送プロトコルを再発明しています。
var wsServer = new websocket.server({
httpServer: server,
maxReceivedFrameSize: 131072,
maxReceivedMessageSize: 10 * 1024 * 1024,
autoAcceptConnections: false
});
デフォルトのmaxFrameSizeとMessageSizeを変更する