之前项目为了快速处理,在服务端推送到客户端消息后,确保客户端收到消息,沿用了netty自带的监听器方式。代码如下:
ctx.channel()
.writeAndFlush(...)
.addListener((ChannelFuture writeFuture) -> {
//消息发送成功
if (writeFuture.isSuccess()) {
//...
}
//消息发送失败
else {
ChannelUtils.closeOnFlush(ctx.channel());
}
});
推送过猛的时候,突然发现客户端会丢包,之前一直觉得tcp协议确保可靠性传输,后来深入发现不是那么回事。发现: TCP不保证您的邮件已收到。它提供可靠的有序字节流。它对您的消息一无所知,也无法告诉您远程主机何时收到该消息。因此Netty也不会。 Netty只能告诉您,您的消息在传输之前已写入操作系统缓冲区。TCP只保证过程不丢,不代表客户端一定会收到,这个TCP是不知情的。
突然醒悟,不能偷懒,麻蛋必须等客户端收到消息后给予一个回执,这个需要在应用层进行处理,立帖警戒。哈哈