有没有办法将TCP_NODELAY设置为Socket.flush(),NetConnection.call()或sendToURL()?

时间:2009-06-25 03:25:42

标签: flex flash

我正在使用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);

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

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

如果服务器本身收到300毫秒的数据并不重要 - 我意识到我无法超越光速。

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

或者,您可能会看一下像Hemlock这样的东西: http://hemlock-kills.com/

答案 1 :(得分:0)

嗨,套接字打开了Nagle算法。这样做是为了保持200ms的“第一次”写入,因此它可以与此时间窗口内的任何后续写入合并,这意味着更少的数据包通过网络传输。对于大多数现代应用程序和网络工程师来说,这是完全愚蠢和不合适的,因为他们希望设置TCP_NODELAY并准确控制何时进行传输,并且能够在将它们写入套接字之前将它们的字节聚集在缓冲区中。原因很可能是Adobe的某个人曾想限制此选项以推动人们使用RTMP协议及其商业/昂贵的LCDS系统(我认为您可以设置客户端没有延迟选项来自RTMP连接的服务器端)。 Ahem Adob​​e,变得真实,请尽快添加TCP_NODELAY,因为您只是在损害Flash生态系统并且不会增加利润!