Transferts basés sur des streams

Avec les transferts par streams tels que TCP/IP, les données reçues sont stockées dans un tampon de réception de socket qui n’est pas une file d’attente de paquets, mais une file d’octets. La taille des paquets est différente de la taille du tampon. Il y a donc de la fragmentation et il est possible qu’un fragment (par exemple, le dernier) ne remplisse pas son tampon et qu’il ne soit rendu disponible que lors de l’envoi suivant qui complète alors la fin du tampon.

La partie réceptrice, côté serveur ou côté client, doit défragmenter les données reçues en une ou plusieurs trames traitables par la logique de l’application.

Par exemple, pour un message de 4 octets qui est petit par rapport à la taille d’un tampon normal, une solution simpliste consiste à créer un tampon cumulatif interne et à attendre que les 4 octets soient reçus dans le tampon interne.

Voici une première implémentation du TimeClientHandler modifié qui résout le problème :

public class TimeClientHandler extends ChannelInboundHandlerAdapter { 
 private ByteBuf buf; 
 
 @Override 
 public void handlerAdded(ChannelHandlerContext ctx) { 
   buf = ctx.alloc().buffer(4); // (1) 
 } 
 
 @Override 
 public void handlerRemoved(ChannelHandlerContext ctx) { 
   ...
Pour consulter la suite, découvrez le livre suivant :
couv_EPREAJASP.png
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Exemples
Suivant
Arrêt de l’application