0

我正在使用 Netty 4 RC1。我在客户端初始化我的管道:

public class NodeClientInitializer extends ChannelInitializer<SocketChannel> {

  @Override
  protected void initChannel(SocketChannel sc) throws Exception {
    // Frame encoding and decoding
    sc.pipeline()
      .addLast("logger", new LoggingHandler(LogLevel.DEBUG))

    // Business logic
      .addLast("handler", new NodeClientHandler());
  }
}

NodeClientHandler 有以下相关代码:

public class NodeClientHandler extends ChannelInboundByteHandlerAdapter {
  private void sendInitialInformation(ChannelHandlerContext c) {
    c.write(0x05);
  }

  @Override
  public void channelActive(ChannelHandlerContext c) throws Exception {
    sendInitialInformation(c);
  }
}

我使用以下方式连接到服务器:

  public void connect(final InetSocketAddress addr) {
    Bootstrap bootstrap = new Bootstrap();
    ChannelFuture cf = null;
    try {
      // set up the pipeline
      bootstrap.group(new NioEventLoopGroup())
        .channel(NioSocketChannel.class)
        .handler(new NodeClientInitializer());

      // connect
      bootstrap.remoteAddress(addr);
      cf = bootstrap.connect();
      cf.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture op) throws Exception {
          logger.info("Connect to {}", addr.toString());
        }
      });

      cf.channel().closeFuture().syncUninterruptibly();
    } finally {
      bootstrap.shutdown();
    }
  }

所以,我基本上想做的是在通道处于活动状态(即连接成功)之后,从客户端向服务器发送一些初始信息。但是,在执行此操作时,c.write()我收到以下警告并且没有发送任何包裹:

WARNING: Discarded 1 outbound message(s) that reached at the head of the pipeline. Please check your pipeline configuration.

我知道我的管道中没有出站处理程序,但我认为我不需要一个(此时),我认为 Netty 会小心地将 ByteBuffer 传输到服务器。我在管道配置中做错了什么?

4

1 回答 1

1

如果您写入 Channel,Netty 默认只处理 ByteBuf 类型的消息。所以你需要把它包装在一个 ByteBuf 中。另请参阅 Unpooled 类及其静态帮助程序以创建 ByteBuf 实例。

于 2013-04-02T11:34:33.877 回答