我正在创建客户端-服务器系统,它应该能够在可用的网络中工作。它假设连接可能一次中断,然后系统必须重新连接并继续工作。我正在使用 Netty 并遇到一个问题:我们怎么知道我们发送的消息被另一台主机接收了?
我在想,为此可以使用 ChannelFuture,如果在附加的未来监听器中失败,我可以简单地尝试再次发送消息:
ChannelFuture fut = channel.write(message);
fut.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (!future.isSuccess()) {
LOGGER.error("Message send failed. Message: " + message, future.getCause());
//Queue message to be send after reconnect
}
}
});
但是当我完成后,我注意到,那个监听器从不打印错误。(当系统几乎不工作时,我通过从网络上拔下插头对此进行了测试)此外,我注意到我发送的所有消息期货都进入“完成”状态,并且无法确保收到消息(不使用确认消息)
据我所知,TCP 协议保证该消息会被接收,并且在使用它时,我们可以知道哪些发送包到达了目的地,哪些没有。我不敢相信Netty不允许知道它。
有什么好方法可以知道消息已送达吗?