Comme j'utilise plus régulièrement des connexions WebSocket, je me suis intéressé à la façon dont les choses fonctionnent sous le capot. J'ai donc creusé dans les interminables documents de spécification pendant un moment, mais jusqu'à présent, je n'ai pas vraiment pu trouver quoi que ce soit sur les sujets suivants le découpage du flux de transmission lui-même .
Le protocole WebSocket l'appelle cadres de données (qui décrit le flux de données pur, il est donc aussi appelé cadres de non-contrôle ). D'après ce que j'ai compris de la spécification, il n'y a pas de longueur maximale définie ni de valeur MTU (unité de transfert maximale), ce qui signifie qu'une seule trame de données WebSocket peut contenir, selon la spécification ( !), une quantité infinie de données (veuillez me corriger si je me trompe, je suis encore étudiant dans ce domaine).
Après avoir lu ça, j'ai instantanément installé mon petit Nœud Serveur WebSocket. Comme j'ai une forte Ajax (également sur le streaming et Comet), mes attentes étaient à l'origine du genre, " il doit y avoir une sorte de mode interactif pour lire les données pendant qu'elles sont transférées ". Mais je me trompe, n'est-ce pas ?
J'ai commencé petit, avec 4kb de données.
serveur
testSocket.emit( 'data', new Array( 4096 ).join( 'X' ) );
et comme prévu, cela arrive sur le client sous la forme d'un seul flux de données.
client
wsInstance.onmessage = function( data ) {
console.log( data.length ); // 4095
};
donc j'ai augmenté la charge utile et je m'attendais à nouveau à ce qu'à un moment donné, le côté client onmessage
se déclenchera de manière répétée, ce qui aura pour effet de bloquer la transmission. Mais à mon grand étonnement, cela ne s'est jamais produit ( serveur de nœuds testé sur firefox , chrome y safari côté client). Ma plus grosse charge utile était 80 MB
testSocket.emit( 'data', new Array( 1024*1024*80 ).join( 'X' ) );
et ça arrive toujours en un seul gros morceau de données sur le client. Bien sûr, cela prend un certain temps même si vous avez une bonne connexion. Les questions ici sont
- est-il possible de fragmenter ces flux, comme pour le mode XHR readyState3 ? ?
- Y a-t-il une limite de taille pour un seul cadre de données ws ? ?
- Les websockets ne sont-elles pas censées transférer des charges utiles aussi importantes ? (ce qui m'amène à me demander pourquoi il n'y a pas de taille maximale définie).
Il se peut que je regarde encore les WebSockets d'un mauvais œil. Il n'est peut-être pas nécessaire d'envoyer de grandes quantités de données, et il est préférable de fractionner les données de manière logique avant de les envoyer ?