2017-02-10 1 views
0

Voici le seul gestionnaire dans le client Netty, j'ai envoyé 3 paquets au serveur.Netty: Pourquoi différents paquets sont connectés ensemble comme une requête sur le serveur?

@Sharable 
public class ClientHandler extends ChannelInboundHandlerAdapter { 
    @Override 
    public void channelActive(ChannelHandlerContext ctx) { 
     ctx.writeAndFlush(Unpooled.copiedBuffer("1", CharsetUtil.UTF_8)); 
     ctx.writeAndFlush(Unpooled.copiedBuffer("2", CharsetUtil.UTF_8)); 
     ctx.writeAndFlush(Unpooled.copiedBuffer("3", CharsetUtil.UTF_8)) 
       .addListener(ChannelFutureListener.CLOSE); 
    } 
} 

Dans le gestionnaire de serveur, je viens de l'imprimer, attendu 3 fois avec séparé 1, 2 et 3, mais en fait 123. Qu'est-il arrivé? Est-ce que ce ne sont pas des paquets différents?

@Sharable 
public class ServerHandler extends SimpleChannelInboundHandler<ByteBuf> { 
    @Override 
    public void channelRead0(ChannelHandlerContext ctx, ByteBuf in) { 
     System.out.println(in.toString(CharsetUtil.UTF_8)); 
    } 
} 

Répondre

2

Le protocole TCP/IP (que vous utilisez probablement sur votre serveur) est basé sur les flux. Cela signifie que le tampon d'un transport basé sur un flux n'est pas une file d'attente de paquets mais une file d'octets. Il revient donc à l'OS d'envoyer vos données - sous forme de paquets séparés ou de 1 paquet avec toutes vos données combinées.

Vous avez 3 options, soit ajouter un séparateur ou envoyer des paquets de longueur fixe ou attacher la taille de paquet au message.

Here is plus de détails dans la documentation de netty.