我正在创建客户端 - 服务器系统,应该能够在ustable网络中工作。它假定一次可以断开连接,然后系统必须重新连接并继续工作。我使用Netty并且遇到了问题:我们如何知道我们发送的邮件已被另一主机接收?TCP 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
}
}
});
但是当我做,我注意到,该监听器从不打印错误。 (我从网络unpluging当系统几乎不起作用测试这个) 此外,我注意到,所有期货交易的消息,这是我送,进入“完成”状态并没有办法不保证邮件收到(不使用确认消息)
我所知,可能会收到的TCP协议的担保信息,并与它一起工作时,我们就可以知道哪个送包到达目的地,并且没有。我不能相信Netty不允许知道它。
有没有一种很好的方法来知道该消息已交付?
TCP确实保证,如果消息(或其对应的字节)被写入TCP套接字,则该信息(或它的字节)将最终传递到客户端套接字。它可能不知道应用程序级别的消息,但它确实保证消息传递。如果网络或物理层导致无法解决的问题,那么它将至少通知发送套接字失败的消息。 – Bhaskar 2017-08-30 19:16:36