【问题标题】:Is there a way to set TCP_NODELAY to Socket.flush(), NetConnection.call() or sendToURL()?有没有办法将 TCP_NODELAY 设置为 Socket.flush()、NetConnection.call() 或 sendToURL()?
【发布时间】:2012-04-14 07:59:58
【问题描述】:

我正在使用 Flex/Flash 客户端和我自己在 Linux 上运行的服务器编写一个实时应用程序。

我希望能够从 Flex 客户端实时发送数据(以响应用户操作)。我试过以下方法:

  • flash.net.NetConnection.call()
  • flash.net.sendToURL()
  • flash.net.Socket.write() 后跟 flash.net.Socket.flush()

在每种情况下,这些调用总是等待服务器发送 ACK,然后才能再次发送数据。换句话说,如果你这样做:

var nc:NetConnection;
// Setup code left out
nc.call("foo", someData);
// Some more code left out
nc.call("foo", moreData);

在收到第一个调用的 ACK 之前,上面的第二个 nc.call() 不会向服务器发送数据。我希望能够立即发送数据而无需等待该 ACK。

如果到服务器的往返时间很长(例如 300 毫秒),我只能每秒向服务器发送 3 次数据。理想情况下,我希望能够每秒最多发送 30 次数据,但目前只有大约 30 毫秒的 RTT 才能做到这一点。

如果服务器本身延迟 300 毫秒获取数据也没关系 - 我意识到我无法超越光速。

有什么方法可以让 Flash Player 在不等待 ACK 的情况下发送数据?在其他环境中,这是通过在套接字上设置 TCP_NODELAY 标志来完成的,但似乎我在 Flash/Flex 中没有那种级别的控制。

更新:我想我可能偶然发现了一个解决方法。我认为 Flash Player 试图让主机浏览器为每个 NetConnection 对象提供一个单独的 TCP 连接,这取决于每个浏览器的连接限制,例如2 为 IE。连接限制可以通过使用子域来解决(还没有尝试过),所以希望可以通过使用 NetConnections 池来更接近实时行为。

谢谢。

【问题讨论】:

    标签: apache-flex flash


    【解决方案1】:

    或者,你可以看看像 Hemlock 这样的东西: http://hemlock-kills.com/

    【讨论】:

    • 铁杉看起来不错。我还没有深入研究代码,但我尝试了绘图小部件并使用数据包嗅探器查看它正在使用 XMPP。我认为它使用的是 Flash 插座。它仍然遇到与我相同的问题,即它无法发送重叠数据包:它必须等待 ACK 才能发送下一个数据包。这似乎是 Flash 的限制。绘图小部件通过错开接收到的绘图命令而不是一次绘制它们来进行补偿,这很聪明。如果可能的话,坚持使用 HTTP 也很好,可以越过防火墙/代理。
    【解决方案2】:

    您好,套接字已启用 Nagle 算法。它的作用是将“第一次”写入保持 200 毫秒,因此它可以与此时间窗口内的任何后续写入合并,这意味着通过网络发送的数据包更少。对于大多数现代应用程序和网络工程师来说,这完全是愚蠢和不合适的,因为他们希望设置 TCP_NODELAY 并准确控制何时进行传输,并且非常有能力在将它们的字节写入套接字之前将它们打包在缓冲区中。造成这种情况的原因很可能是 Adob​​e 中的某个人曾经想要限制此选项以推动人们使用 RTMP 协议及其商业/昂贵的 LCDS 系统(我认为您可以从RTMP 连接的服务器端)。咳咳,Adobe,实事求是,请尽快添加TCP_NODELAY,因为您只是在损害Flash生态系统而不是增加利润!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2013-10-05
      • 2021-01-04
      • 2011-10-19
      相关资源
      最近更新 更多