netty服务端遇到的一个小坑

 之前项目为了快速处理,在服务端推送到客户端消息后,确保客户端收到消息,沿用了netty自带的监听器方式。代码如下:

ctx.channel()
   .writeAndFlush(...)
   .addListener((ChannelFuture writeFuture) -> {
       //消息发送成功
       if (writeFuture.isSuccess()) {
          //...
       } 
       //消息发送失败
       else {
          ChannelUtils.closeOnFlush(ctx.channel());
       }
   });

  推送过猛的时候,突然发现客户端会丢包,之前一直觉得tcp协议确保可靠性传输,后来深入发现不是那么回事。发现: TCP不保证您的邮件已收到。它提供可靠的有序字节流。它对您的消息一无所知,也无法告诉您远程主机何时收到该消息。因此Netty也不会。 Netty只能告诉您,您的消息在传输之前已写入操作系统缓冲区。TCP只保证过程不丢,不代表客户端一定会收到,这个TCP是不知情的。

  突然醒悟,不能偷懒,麻蛋必须等客户端收到消息后给予一个回执,这个需要在应用层进行处理,立帖警戒。哈哈

猜你喜欢

转载自blog.csdn.net/NICVSY/article/details/112223000