我在客户端和我自己的手写服务器上使用Flex编写一个类似Comet的应用程序。
我需要能够以相当高的频率从客户端发送短脉冲数据(例如,发送之间的10 of的顺序)。
我还需要服务器以类似的高频率推送短脉冲数据。
我使用NetConnection.call()将数据发送到服务器,使用URLStream (分块编码)将数据从服务器推送到客户端。
我所发现的是,数据一有了,就不会立即发送/接收。例如,在IE中,数据似乎每200 as发送一次,而不是在调用NetConnection.call()时立即发送。类似地,URLStream没有在服务器发送数据时立即提供数据。
从浏览器之间的行为差异来看,Flash播放器(版本10)似乎依赖于主机浏览器来执行所有的通信。有人能确认吗?更新:这很可能是因为只有主机浏览器才知道可能设置的代理设置。
我尝试过使用套接字类,而且速度没有问题:它工作得很完美。但是,我希望能够使用基于HTTP(端口80)的连接,这样我的应用程序就可以在高度火灾的环境中运行(我尝试在端口80上使用套接字,但这有其问题)。
顺便说一句,所有的开发/测试都是在内部LAN上完成的,所以带宽/延迟不是问题。
更新:正在发送/接收的数据是小数据包,不需要任何特定的格式。例如,我可能需要发送一个简短的数字数组,这可以用AMF编码(例如通过NetConnection.call()),也可以放在GET参数中(例如使用sendToURL())。我的主要问题是看看是否有其他人在频繁调用NetConnection/URLStream时遇到了同样的问题,以及是否有解决办法(当然,错误也可能是我的服务器代码,而不是Flash)。
谢谢。
发布于 2009-06-21 03:43:48
事实证明,这个问题与Flash/Flex或任何主机浏览器无关。问题在于我的服务器代码(在Linux上用C++编写),如果不能访问我的源代码,就很难找到原因(所以我不可能希望从这个论坛得到答案)。
不过,还是-谢谢大家的帮忙。
只有在仔细查看了Wireshark中显示的输出之后,我才注意到了这个问题,这是双重的:
纳格尔算法
我通过多次调用写() (例如,一次针对header,另一次针对HTTP主体),在多个数据包中发送答复。服务器的TCP/IP堆栈在发送第二个数据包之前等待第一个数据包的ACK,但由于Nagle的算法,客户端等待200‘s才将ACK发送回第一个数据包,因此服务器至少需要200’s才能发送完整的HTTP响应。
解决方案是将发送()与标志MSG_MORE一起使用,直到编写了所有逻辑连接的块。我也可以将写()或塞托克普()与TCP_CORK一起使用,但使用发送()更适合我现有的代码。
块编码流
我正在使用带有块编码的无休止HTTP响应将数据推回客户端。Naggle的算法需要在这里关闭,因为即使每个块被写成一个数据包(使用MSG_MORE),客户端OS /IP堆栈在发回ACK之前仍将等待多达200 is,并且服务器在得到该ACK之前不能推送后续块。
这里的解决方案是要求服务器在发送下一个数据包之前不要等待每个发送的数据包的ACK,这是通过使用塞托克普()标志调用TCP_NODELAY来完成的。
上面的解决方案只在Linux上工作,不兼容POSIX(我认为),但这对我来说不是问题。
发布于 2009-06-18 06:56:42
我几乎100%肯定播放器依赖浏览器进行这样的通信。找不到这样的自动取款机的官方页面,但请查看这,例如:
承载Flash控件或Flash插件的应用程序可以使用EnforceLocalSecurity和DisableLocalSecurity API调用来控制安全设置。
我想这暗示了这个想法。另外,我只在FF/IE上遇到了一些与网络相关的错误,这再次向玩家指出使用每个浏览器进行网络连接(否则不会有这样的区别)。
关于你的延迟问题,我认为如果速度是关键的,你最好的选择是插座。您有一些工作要做,但似乎有可能再次查看文档:
此错误发生在SWF内容中。 如果对Socket.connect()的调用试图连接到调用方安全沙箱之外的服务器,或者连接到低于1024的端口,则发出调度。您可以通过在服务器上使用跨域策略文件来解决这两个问题。
HTH,
胡安
https://stackoverflow.com/questions/1009792
复制相似问题