2017-02-10 43 views
0

Вот единственный обработчик в Netty-клиенте, я отправил на сервер 3 пакета.Netty: Почему разные пакеты соединены вместе как запрос на сервере?

@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); 
    } 
} 

В обработчике сервера, я просто распечатать его, как ожидается 3 раза с отдельным 1, 2 и 3, но 123 на самом деле. Что случилось? Разве это не разные пакеты?

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

ответ

2

Протокол TCP/IP (который вы, вероятно, используете на своем сервере) основан на потоке. Это означает, что буфер транспортного потока, основанного на потоке, не является очередью пакетов, а представляет собой очередь байтов. Таким образом, до ОС как отправлять свои данные - как отдельные пакеты, так и 1 пакет со всеми вашими данными.

У вас есть 3 варианта: либо добавить разделитель, либо отправить пакеты с фиксированной длиной, либо прикрепить размер пакета к сообщению.

Here is подробная информация о документации нетто.