Netty отправляет 2 пакета вместо одного

#java #tcp #netty

#java #tcp #netty

Вопрос:

Я делаю свои первые шаги с netty, и мне интересно следующее поведение netty:

Когда я использую следующий обработчик:

 public class SimpleServerHandler extends ChannelInboundHandlerAdapter {

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    ByteBuf inBuffer = (ByteBuf) msg;

    String received = inBuffer.toString(CharsetUtil.UTF_8);
    System.out.println(dateFormat.format(new Date())   " Server received: "   received);

    ctx.writeAndFlush(Unpooled.copiedBuffer("Hello "   received, CharsetUtil.UTF_8));
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    cause.printStackTrace();
    ctx.close();
}
}
  

И затем я отправляю TCP-пакет с «Отправителем пакета», я получаю три пакета

первый — от «отправителя пакета» на сервер, второй — ответ от сервера (что-то вроде «Привет, тесттест»), а затем .. и я не знаю, откуда приходит этот пакет: третий — от сервера к «отправителю пакета», без какого-либо содержимого

Мой сервер java:

 public class MainNettyApplicationServer {

public static void main(String[] args) throws InterruptedException {
    EventLoopGroup group = new NioEventLoopGroup();

    try {
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(group);
        serverBootstrap.channel(NioServerSocketChannel.class);
        serverBootstrap.localAddress(new InetSocketAddress("10.0.0.2", 11111));

        serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
            protected void initChannel(SocketChannel socketChannel) throws Exception {
                socketChannel.pipeline().addLast(new SimpleServerHandler());
            }
        });
        ChannelFuture channelFuture = serverBootstrap.bind().sync();
        System.out.println("Server started.");
        channelFuture.channel().closeFuture().sync();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        group.shutdownGracefully().sync();
    }
}

}
  

Комментарии:

1. Сегмент подтверждения?

2. Какие флаги TCP присутствуют в обоих пакетах?

3. не могли бы вы, пожалуйста, сказать мне, какой инструмент необходим для просмотра флагов TCP?