代码之家  ›  专栏  ›  技术社区  ›  Tiina

为什么通道还没有连接?

  •  1
  • Tiina  · 技术社区  · 6 年前

    客户端通道在服务器入站通道中初始化 channelactive method。我可以看到PCAP已经完成了3路握手(253是本地主机,15是远程主机)

    但是当写入客户机通道时,它抛出

    java.nio.channels.notyetconnectedException:处为空 io.netty.channel.abstractChannel$abstractUnsafe.flush0()(未知 来源)

    据我所知,客户机通道应该处于活动状态,因为三向握手意味着客户机通道已经准备好发送数据包。但是通过评估clientchannel.isactive(),结果是错误的,奇怪的。

    服务器入站通道:

    channel clientchannel;
    @覆盖
    public void channelactive(channelhandlerContext ctx){
    最终频道inboundChannel=ctx.channel();
    
    试试看{
    bootstrap b=new bootstrap();
    b.group(inboundChannel.eventLoop())
    .channel(inboundChannel.getClass())
    .handler(new someclientchannelinitializer(ctx));
    
    //尝试连接。
    channelfuture f=b.connect(主机、端口);
    clientChannel=f.channel();
    }catch(异常E)//无异常
    }
    
    @覆盖
    公共void channelread(channelhandlerContext CTX,object msg)引发异常{
    log.info(“接收:”,msg);
    clientchannel.writeandflush(msg->this::pojo);
    }
    

    编辑: 我通过添加wait解决了这个问题。

    f=b.connect(主机,端口);
    clientChannel=f.channel();
    试试看{
    f.等待(3L,时间单位,秒);
    布尔成功=clientChannelFuture.issueAccess();
    

    我不确定这是否合适,官方代理的例子没有这个。

    packets in pcap

    但是当写入客户机通道时,它抛出

    java.nio.channels.notyetconnectedException:处为空 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 回复  |  直到 6 年前
        1
  •  2
  •   Norman Maurer    6 年前

    ChanneFutureListener 连接到Connect的 ChannelFuture sync() wait()

    connect write Channel