为何频道尚未连接

时间:2018-06-27 01:29:12

标签: netty

使用服务器入站通道channelActive方法初始化客户端通道。而且我可以看到pcap已完成3次握手(本地主机为253,远程主机为15)

packets in pcap

但是在写入客户频道时,它会抛出

  

java.nio.channels.NotYetConnectedException:在null   io.netty.channel.AbstractChannel $ AbstractUnsafe.flush0()(未知   来源)

据我了解,客户端通道应处于活动状态,因为三向握手意味着客户端通道已准备好发送数据包。但是通过评估clientChannel.isActive(),结果是错误的,奇怪的。

服务器入站通道:

Channel clientChannel;
@Override
public void channelActive(ChannelHandlerContext ctx) {
    final Channel inboundChannel = ctx.channel();

    try {
        Bootstrap b = new Bootstrap();
        b.group(inboundChannel.eventLoop())
            .channel(inboundChannel.getClass())
            .handler(new SomeClientChannelInitializer(ctx));

        // Make the connection attempt.
        ChannelFuture f = b.connect(host, port);
        clientChannel = f.channel();
    } catch (Exception e) {// no exception}
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    log.info("receive: {}", msg);
    clientChannel.writeAndFlush(msg -> this::pojo);
}

编辑: 我通过添加wait

解决了这个问题
  f = b.connect(host, port);
  clientChannel = f.channel();
  try {
      f.await(3L, TimeUnit.SECONDS);
      boolean success = clientChannelFuture.isSuccess();

我不确定这是否合适,官方代理示例没有此内容。

1 个答案:

答案 0 :(得分:2)

您要么需要通过连接到连接ChanneFutureListener的{​​{1}}进行写操作,要么需要在连接上ChannelFuture / sync()上书写。

记住netty中的所有内容都是异步的,这意味着当wait()方法返回并触发connect时,write可能尚未完全连接。