当前位置: 首页 > 知识库问答 >
问题:

Netty为什么通道尚未连接

蒋俊人
2023-03-14

客户端通道在服务器入站通道激活方法中初始化。我可以看到pcap已经完成了三次握手(253是本地主机,15是远程主机)

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

java.nio.channels。NotYetConnectedException:io.netty.channel.AbstractChannel$AbstractUnsafe处为null。flush0()(未知源)

根据我的理解,客户端通道应该处于活动状态,因为3次握手意味着客户端通道已经准备好发送数据包。但是通过评估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个答案

傅阳
2023-03-14

您要么需要通过附加到连接ChannelFutureChanneFutureListener编写,要么需要sync()/等待()在上面。

请记住,netty中的一切都是异步的,这意味着当连接方法返回时,您触发写入时,通道可能尚未完全连接。

 类似资料:
  • 我正在学习Netty,我不太了解ChannelFuture的同步方法,这是我的示例: 我的问题是,无论我在EchoClient中删除了什么sync()。ChannelFuture的类f=b.connect()。无论是否为sync(),结果总是:aaa 8811 bind success 在我看来,如果添加sync(),结果应该是:8811 bind success aaa 由于主线程会等待通道连接

  • 我想创建一个可以重用通道的连接池,但我想不通 执行此测试 我在第二个频道遇到了ClosedChannel异常。写入(请求)。。。。 存在重用通道的方法吗?还是保持通道打开? 提前感谢

  • 我有一个服务器和一个客户端,它们有自己的引导程序。我的问题是,不同的连接用于不同的目的。一个用于控制通道(与服务器通信并返回),然后建立其他连接以进行数据传输。我以编程方式将idlestate处理程序仅添加到需要它的连接管道中,但在调试之后,我发现无论连接如何,通道总是相同的。因此,我的数据传输正在影响生存。我通过向netty IdleStateHandler添加调试并输出通道id看到了这一点。很

  • 我正在使用Netty框架并实现客户端和服务器。我建立了多达1000个连接。我想在多个地方配置超时值。其中一些我能理解。下面是我的netty实现的netty行为: 1。许多异步连接都是从具有超时的客户端开始的(使用ChannelOption.CONNECT\u timeout\u MILLIS配置) 2。那些能够连接的客户端连接使用channelActive发送HTTP请求,并使用channelRe

  • 文件上说 请注意,此处理程序的管道覆盖范围为“全部”,这意味着必须仅创建一个此类处理程序并在所有通道之间共享,因为计数器必须在所有通道之间共享。 我理解必须共享此处理程序。 假设我有两组通道。我可以为每个组使用不同的GlobalChannelTrafficShapingHandler实例吗?

  • 在我的应用程序与RabbitMQ服务器失去连接后,我在日志中看到 然后,当我的应用程序重新连接到RabbitMQ服务器时,我在日志中看到 但是,当应用程序重新连接到RabbitMQ服务器时,通道不会重新打开,在RabbitMQ管理控制台中,我可以在“通道”选项卡中看到没有任何通道。 重新连接后,在RabbitMQ服务器日志中: 我使用的是Spring Boot 1.5.3和Spring Boot