2012-01-18 6 views
1

Je suis en train de concevoir un protocole binaire pour la communication client/serveur en utilisant Netty et le nombre d'octets envoyés n'est pas fixe et peut être de taille arbitraire.Faire face à la fragmentation dans Netty

Le client envoie quelque chose comme ceci:

4 premiers octets pour représenter un numéro d'identification les octets restants est une chaîne

Dans l'exemple que je l'ai vu, le message a été une taille fixe, mais Le contenu de la chaîne peut être de n'importe quelle taille et doit garantir qu'il n'est pas fragmenté lorsqu'il est reçu par le serveur. Comment pourrais-je réaliser cela dans Netty?

Merci d'avance.

Répondre

3

Comment déterminez-vous la fin du message? Un zéro? Je vérifierais le Netty décodeur rejouant:

http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/codec/replay/ReplayingDecoder.html

Cela rend les choses faciles pour vous. Continuez à lire jusqu'à ce que vous trouviez un zéro. Si vous n'avez plus d'octets avant d'atteindre le zéro, une exception sera émise pour quitter la méthode de décodage. Lorsque plus d'octets sont disponibles, la méthode de décodage sera appelée à nouveau avec les octets existants et les nouveaux octets combinés dans un ChannelBuffer.

Ce cycle peut être répété jusqu'à ce que vous ayez le message entier dans le ChannelBuffer ... que vous pouvez ensuite passer à la couche suivante pour traitement.

S'il était possible de changer votre protocole, j'ajouterais une longueur car être capable de lire à longueur est beaucoup plus efficace que de vérifier chaque octet pour un zéro.

+1

Salut Gareth, merci pour la réponse - très apprécié. Je n'utilise actuellement rien pour déterminer la fin d'un message. Une fois que je récupère l'id en invoquant buffer.readLong(), j'appelle ensuite buffer.toString (String charsetName) - ce qui n'est pas idéal. Lorsque vous faites référence à l'envoi de la taille de la charge utile, suggérez-vous de l'ajouter au début et d'attendre que la longueur soit reçue, et d'utiliser ce nombre arbitraire pour déterminer d'attendre plus d'octets sur le serveur? – algolicious

+0

Oui. Une fois que vous avez une longueur, vous pouvez utiliser à la place le LengthFieldBasedFrameDecoder (si vos messages sont susceptibles d'être très volumineux mais il est probablement préférable d'écrire les vôtres sur SimpleChannelUpstreamHandler pour que le buffer ne soit alloué qu'une seule fois). – Gareth