为什么传出的 Netty UDP 通道会自动关闭?

问题描述

我正在实现一些 Java 代码,这意味着向远程主机发送定期(1 秒周期)心跳消息。心跳作为 UDP 单播消息发送到远程主机。我正在使用旧版本的 Netty (3.5.0.Final),因为旧的代码升级 Netty 版本会导致依赖冲突。发送的第一个心跳消息是成功的(通过在发送主机上运行 tcpdump 进行验证),但没有发送第一个之后的所有其他发送的心跳。

我的调试工作表明,我打开的用于发送消息的 Channel 对象在发送第一条消息后不久将状态更改为 isopen()=false 和 isConnected()=false,并且所有进一步尝试调用其 write 方法得到一个 ClosedChannelException。我不明白为什么 Channel 会自动关闭。需要做什么才能让它保持打开状态以发送多条消息?

创建和连接发送通道对象的代码如下所示:

private Channel open() throws InterruptedException {
    ChannelFactory channelFactory =
        new NioDatagramChannelFactory(Executors.newCachedThreadPool(),InternetProtocolFamily.IPv4);
    ConnectionlessBootstrap bootstrap = new ConnectionlessBootstrap(channelFactory);
    bootstrap.setPipelineFactory(new HeartbeatSenderPipelineFactory());
    ChannelFuture channelFuture =
        bootstrap.connect(new InetSocketAddress(remoteHost,heartbeatPort)).sync();
    return channelFuture.getChannel();
}

我注意到这个问题的另一个特点。用于接收心跳消息的远程主机上有一个软件,当运行时,它将打开一个 UDP 接收器来接收心跳消息。如果我在远程主机上运行该软件,然后在心跳发送器上运行 Java 软件,远程主机将按预期接收定期心跳消息。但是,如果我在心跳发送器上运行 Java 软件而接收器上的软件没有运行(接收器主机仍在运行,只是没有运行该软件),则 tcpdump 仅报告发送到远程主机的一条消息。因此,如果接收主机运行软件来接收消息,似乎不会发生 ClosedChannelException,但为什么呢?如果 UDP 是一种无连接协议,它不应该能够在不需要远程主机接收消息的情况下发送消息吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...