web-dev-qa-db-fra.com

Limite de taille de trame Websocket

J'envoie d'énormes morceaux de données JSON via des Websockets. Le JSON peut avoir plus de 1000 entrées. En raison de la limitation de la taille des images, le protocole Websocket divise automatiquement le JSON en images, ce qui ne peut être résolu. Comme nous ne pouvons pas changer la taille du cadre des websockets.

Le problème:

Lorsque j'essaie d'évaluer mon code JSON à l'aide de JSON.parse, une erreur d'analyse est évidente, car les images ne sont pas des objets JSON complets. Tout cela se produit dans le rappel d'événement Websocket onmessage. Comment puis-je recevoir l'énorme JSON dans différents cadres et pouvoir toujours l'analyser? J'ai essayé de concaténer les cadres dans onmessage mais l'erreur persiste.

Question annexe:

Comment concatiner un JSON cassé correctement?

11
Gaurav Bhor

Un seul cadre WebSocket, par RFC-6455 , a une taille maximale de 2 ^ 63 octets (9 223 372 036 854,775 octets ~ = 9,22 exaoctets) (correction de @Sebastian )

Cependant, un message WebSocket, composé d'une ou plusieurs trames, n'est pas limité par le niveau de protocole.

Chaque implémentation WebSocket traitera différemment les limites de message et de trame. Par exemple, définir la taille maximale des messages pour l'ensemble du message (généralement pour des raisons de consommation de mémoire) ou proposer des options de diffusion en continu pour les messages volumineux afin de mieux utiliser la mémoire.

Mais dans votre cas, il est probable que l’implémentation WebSocket choisie comporte un bogue et ne scinde pas correctement le message JSON en plusieurs messages, au lieu de plusieurs cadres. Vous pouvez utiliser l'outil d'inspection du réseau dans Chrome ou un outil externe tel que Wireshark pour confirmer ce comportement.

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

Changer le maxFrameSize & MessageSize par défaut

1
Dc_Neo

Etant donné que vous utilisez WS, qui est de bas niveau, vous devez créer un protocole d’application qui traite les données envoyées sur plusieurs trames WS. C'est à vous de concaténer les données qui se trouvent dans chaque cadre WS (d'ailleurs, ne concattez pas les cadres ... concattez les données de chaque cadre).

En gros, vous réinventez un protocole de transfert de fichiers.

0
FrankG