问题描述
我正在实现一些 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 (将#修改为@)