Comment (dé)construire des trames de données dans les WebSockets hybi 08+?
Depuis Chrome mis à jour v14, ils sont passés de la troisième version du projet de à version huit du projet.
J'ai déjà un chat de l'application en cours d'exécution sur WebSocket, et bien que j'ai reçu la nouvelle poignée de main de travail, les données de cadrage a apparemment changé. Mon serveur WebSocket est basé sur Pépite.
Quelqu'un at-il WebSocket qui fonctionne avec la version huit du projet et avez un exemple sur la façon de structurer les données envoyées sur le fil?
OriginalL'auteur gislikonrad | 2011-08-12
Vous devez vous connecter pour publier un commentaire.
(Voir aussi: Comment puis-je envoyer et recevoir des messages WebSocket sur le serveur?)
Il est assez facile, mais il est important de comprendre le format.
Le premier octet est presque toujours
1000 0001
, où la1
signifie "la dernière image", les trois0
s sont réservés bits sans aucun sens de la mesure et de la0001
signifie que c'est un bloc de texte (Chrome envoie avec lews.send()
méthode).(Mise à jour: Chrome peut également en envoyer binaire des cadres avec un
ArrayBuffer
. Les quatre derniers bits du premier octet sera0002
, de sorte que vous pouvez différer entre texte et des données binaires. Le décodage des données fonctionne exactement de la même façon.)Le deuxième octet contient un
1
(ce qui signifie qu'il est "masqué" (codée)), suivie de sept bits qui représentent la taille de l'image. Si c'est entre000 0000
et111 1101
, c'est la taille. Si c'est111 1110
, les 2 octets pour la longueur (parce que cela ne rentre pas dans les sept bits), et si c'est111 1111
, le 8 octets suivants sont de la longueur (si il ne rentrait pas dans deux octets).Suivants sont quatre octets qui sont les "masques" dont vous avez besoin pour décoder les données de la trame. Ceci est fait en utilisant xor codage qui utilise l'un des masques définis par
indexOfByteInData mod 4
des données. Décodage fonctionne tout simplement commeencodedByte xor maskByte
(oùmaskByte
estindexOfByteInData mod 4
).Maintenant, je dois dire que je ne suis pas expérimenté avec C#, mais c'est une pseudo-code (JavaScript accent j'ai peur):
Vous pouvez également télécharger la spécification qui peut être utile (il contient tout ce dont vous avez besoin pour comprendre le format).
Enfin eu le temps de regarder cette solution pour mon serveur websocket. A travaillé comme un charme... Merci, l'homme...
Konráð: la Grande il a travaillé pour vous; WebSockets ne sont pas vraiment de débogage de l'environnement.
Je pense que ton code n'est pas complet quand j'système de test, j'obtiens cette octets à partir d'un client websocket et ne peut pas décoder ce octets: 136,128,44,185,105,136 deuxième octet est de 128 et il n'est pas de soutenir dans votre code?
OriginalL'auteur pimvdb
Ce code c# fonctionne très bien pour moi. Décoder des données de texte qui vient à partir d'un navigateur à un c# serveur via socket.
Qu'est-ce que
totalLength
et pourquoi êtes-vous en ajoutantkeyIndex + 4
?OriginalL'auteur Daniel Grossztein
Pour être plus précis, Chrome a disparu de la Hixie-76 version du protocole à la HyBi-10 version du protocole. HyBi-08 par HyBi-10 de tous les rapports que la version 8 parce que c'était vraiment seulement le texte de la spécification qui a changé et non pas le format de câble.
Le cadrage a changé à partir de l'utilisation de '\x00...\xff' à l'aide d'une 2-7 octet de l'en-tête de chaque trame qui contient la longueur de la charge utile, entre autres choses. Il y a un diagramme de format de trame dans la section 4.2 de la spécification. Notez également que les données du client (navigateur) pour le serveur est masqué (4 octets de client-serveur châssis en-têtes contiennent le démasquage de la clé).
Vous pouvez regarder websockify qui est un WebSockets pour socket TCP proxy/pont que j'ai créé pour soutenir noVNC. Il est implémenté en python, mais vous devriez être en mesure d'obtenir à l'idée de la encode_hybi et decode_hybi routines.
OriginalL'auteur kanaka