web-dev-qa-db-ja.com

Websocketフレームサイズの制限

Websocketを通じてJSONデータの巨大なチャンクを送信しています。 JSONには1000を超えるエントリが含まれる場合があります。フレームサイズの制限により、Websocketプロトコルは自動的にJSONをフレームに分割しますが、これは仕方がありません。 WebSocketのフレームサイズは変更できないため。

問題:

JSON.parseを使用してJSONを評価しようとすると、フレームが完全なJSONオブジェクトではないため、明らかな解析エラーが発生します。これはすべて、Websocket onmessageイベントコールバックで発生します。巨大なJSONを異なるフレームで受信し、それでも解析できるようにするにはどうすればよいですか? onmessageのフレームを連結しようとしましたが、それでもエラーは続きます。

サイド質問:

壊れたJSONを適切に連結する方法は?

16
Gaurav Bhor

RFC-6455ベースフレーミング ごとの単一のWebSocketフレームの最大サイズ制限は2 ^ 63バイト(9,223,372,036,854,775,807バイト〜= 9.22エクサバイト)@ Sebastian

ただし、1つ以上のフレームで構成されるWebSocketメッセージには、プロトコルレベルからの制限はありません。

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

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

27
Joakim Erdfelt

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

基本的に、ファイル転送プロトコルを再発明しています。

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

デフォルトのmaxFrameSizeとMessageSizeを変更する

1
Dc_Neo