【问题标题】:Netty and TCP - How to properly send an empty messageNetty 和 TCP - 如何正确发送空消息
【发布时间】:2019-10-15 16:45:17
【问题描述】:

我们在一个用 Netty 编写的 AWS 网络 ELB(类似于具有长寿命连接的 Echo 服务器)后面有一个简单的 TCP 服务器,我正在尝试实现一个类似于 TCP 保持活动机制的保持活动机制来保持我们的空闲连接打开。不幸的是,我们不能依赖 TCP keep-alive 机制,因为 NELB 不会将 keep-alive TCP 数据包转发到负载均衡器的另一端。
我想做的是监视空闲连接并向客户端发送一个空字符串(空字节数组)。到目前为止,我在代码中所做的是:

  1. 添加带有一些超时值的IdleStateHandler
  2. 注册一个GprsKeepAliveHandlerChannelDuplexHandler的子类,覆盖userEventTriggered方法发送(ctx.writeAndFlushUnpooled.EMPTY_BUFFER

这样,如果连接断开,我希望收到一个 RST 数据包。否则连接将再次激活。

问题是 Netty 没有对空消息做任何事情,它没有向客户端发送任何数据包(由 Wireshark 监控)。如果我将消息更改为Unpooled.wrappedBuffer(new byte[]{0}),我会看到我希望看到的内容。

问题

  1. 我找不到更好的方法来实现我的目标(保持连接活动并检测死连接)。如果有更好的方法,请告诉我。
  2. 在 Netty 中发送空消息的正确方法是什么? (我看到了this 的问题,但没有帮助)
  3. 如果问题是由操作系统 TCP 堆栈行为引起的,有没有办法解决这个问题?

【问题讨论】:

    标签: tcp netty


    【解决方案1】:

    从我的角度来看,您需要发送一些有意义的东西,因为您尝试这样做(例如乒乓球/乒乓球、心跳行为)。另见Is it is possible to force TCP socket to send 0 bytes in case of packet losses - python

    【讨论】:

    • 感谢您的回答。至少协议没有禁止这样做。我希望 Netty 让我这样做。但似乎在空消息的情况下它不会进行任何系统调用。 (还为您提到的帖子添加了一条评论。)
    【解决方案2】:

    似乎 Netty 不会在消息为空的情况下进行任何系统调用。 (见this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2014-08-02
      • 2016-07-16
      相关资源
      最近更新 更多