ChannelRead сервера Netty получает пустой ButBuf с размером 0 - PullRequest
0 голосов
/ 19 сентября 2018

------------ конвейер на стороне клиента (клиент может отправлять сообщения любого типа, например, HTTP-запросы или двоичные пакеты) --------

Bootstrap bootstrap = new Bootstrap()
        .group(group)
     //   .option(ChannelOption.TCP_NODELAY, true)
    //    .option(ChannelOption.SO_KEEPALIVE, true)
        .channel(NioSocketChannel.class)
        .handler(new ChannelInitializer() {
            @Override
            protected void initChannel(Channel channel) throws Exception {
                channel.pipeline()
                        .addLast("agent-traffic-shaping", ats)
                        .addLast("length-decoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4))
                        .addLast("agent-client", new AgentClientHandler())
                        .addLast("4b-length", new LengthFieldPrepender(4))
                ;
            }
        });

------------------------------ Серверный конвейер -----------------

ServerBootstrap b = new ServerBootstrap()
        .group(group)
  //      .option(ChannelOption.TCP_NODELAY, true)
 //       .option(ChannelOption.SO_KEEPALIVE, true)
        .channel(NioServerSocketChannel.class)
        .localAddress(new InetSocketAddress(port))
        .childHandler(new ChannelInitializer() {
                          @Override
                          protected void initChannel(Channel channel) throws Exception {
                              channel.pipeline()
                                      .addLast("agent-traffic-shaping", ats)
                                      .addLast("length-decoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4))
                                      .addLast(new AgentServerHandler())
                                      .addLast("4b-length", new LengthFieldPrepender(4));
                          }
                      }
        );

ChannelFuture f = b.bind().sync();
log.info("Started agent-side server at Port {}", port);

-------- Метод чтения канала с сервера -----------------

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {

    ByteBuf data = (ByteBuf) msg;
    log.info("SIZE {}", data.capacity());
    String s = data.readCharSequence(data.capacity(), Charset.forName("utf-8")).toString();
    System.out.print(s);
    if (buffer != null) buffer.incomingPacket((ByteBuf) msg);
    else {
        log.error("Receiving buffer NULL for Remote Agent {}:{} ", remoteAgentIP, remoteAgentPort);
        ((ByteBuf) msg).release();
    }
 /*   totalBytes += ((ByteBuf) msg).capacity();*/
}

------------ Запись клиента по каналу (данные ByteBuf содержат действительный HTTP-запрос размером 87 байт) --------

private void writeToAgentChannel(Channel currentChannel, ByteBuf data) {

    String s = data.readCharSequence(data.capacity(), Charset.forName("utf-8")).toString();
    log.info("SIZE {}", data.capacity());
    System.out.print(s);

    ChannelFuture cf = currentChannel.write(data);
    currentChannel.flush();

 /*   wCount++;
    if (wCount >= request.getRequest().getBufferSize() * request.getRequest().getNumParallelSockets()) {
        for (Channel channel : channels)
            channel.flush();
        wCount = 0;
    }*/
    cf.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture channelFuture) throws Exception {
            if (cf.isSuccess()) {
                totalBytes += data.capacity();
            }
            else log.error("Failed to write packet to channel {}", cf.cause());
        }
    });
}

Однако сервер получает пустойByteBuf с размером ноль.Что может быть причиной здесь?

1 Ответ

0 голосов
/ 27 сентября 2018

Кажется, ваша проблема связана с клиентом, когда вы случайно потребляете все байты внутри байтового буфера при попытке его отладки.

String s = data.readCharSequence(data.capacity(), Charset.forName("utf-8")).toString();
log.info("SIZE {}", data.capacity());
System.out.print(s);

Вызов readCharSequence потребляет данныеоставив вам осталось 0 байтов.

Я предлагаю использовать DebugHandler для отладки вашего конвейера, так как это проверено, чтобы не влиять на данные

...