actionscript-3 – 奇怪的Flash AS3 xml套接字行为
我有一个我无法理解的问题.
为了理解它,我在AS3上编写了一个套接字客户端,在python / twisted上编写了一个服务器,你可以在下面看到这两个应用程序的代码. 让我们同时启动两个clients,安排它们,这样你就可以在两个窗口看到两个窗口并按下连接按钮.然后按住任何按钮. 我期待的是: 按下按钮的客户端向服务器发送消息“某些数据”,然后服务器将此消息发送给所有客户端(包括原始发件人). 然后每个客户端向右移动按钮’connectButton’并按照以下格式随时间向日志打印消息:“min:secs:milliseconds”. 出了什么问题: 在发送消息的客户端中运动是平滑的,但在所有其他客户端中,运动是不稳定的. 发生这种情况是因为发送给这些客户端的邮件的时间晚于原始发送客户端如果我们有三个客户端(让我们将它们命名为A,B,C)并且我们从A发送消息,则B和C的发送时间日志将是相同的. 为什么其他客户端比原始发件人晚收到此邮件? 顺便说一句,在ubuntu 10.04 / chrome上,所有动作都很流畅.两个客户在分开的chromes中推出. windows screenshot linux screenshot 日志列表,同时列出四个客户端: [16:29:33.280858] 62.140.224.1 >> some data [16:29:33.280912] 87.249.9.98 << some data [16:29:33.280970] 87.249.9.98 << some data [16:29:33.281025] 87.249.9.98 << some data [16:29:33.281079] 62.140.224.1 << some data [16:29:33.323267] 62.140.224.1 >> some data [16:29:33.323326] 87.249.9.98 << some data [16:29:33.323386] 87.249.9.98 << some data [16:29:33.323440] 87.249.9.98 << some data [16:29:33.323493] 62.140.224.1 << some data [16:29:34.123435] 62.140.224.1 >> some data [16:29:34.123525] 87.249.9.98 << some data [16:29:34.123593] 87.249.9.98 << some data [16:29:34.123648] 87.249.9.98 << some data [16:29:34.123702] 62.140.224.1 << some data AS3客户端代码,我只留下相关部分,full code here. private var socket :XMLSocket; socket = new XMLSocket(); socket.addEventListener(DataEvent.DATA,dataHandler); private function dataHandler(event:DataEvent):void { var now:Date = new Date(); textField.appendText(event.data + " time = " + now.getMinutes() + ":" + now.getSeconds() + ":" + now.getMilliseconds() + "n"); connectButton.x += 2; } private function keyDownHandler(event:KeyboardEvent):void { socket.send("some data"); } private function connectMouseDownHandler(event:MouseEvent):void { var connectAddress:String = "ep1c.org"; var connectPort:Number = 13250; Security.loadPolicyFile("xmlsocket://" + connectAddress + ":" + String(connectPort)); socket.connect(connectAddress,connectPort); } Python server code. 解决方法
您可能正在经历
ACK delay和/或
Nagle’s algorithm的某种组合.这两种组合都可以选择性地延迟TCP会话上的数据移动,并且它们的实现因平台而异.
尝试在套接字上使用带有TCP_NODELAY的setsockopt()来禁用Nagle. AFIK,Windows不允许您在每个插槽的基础上禁用ACK延迟:您必须edit the registry并为所有TCP禁用它.所以先试试TCP_NODELAY.如果这不起作用,那么试验禁用ACK延迟.即使注册表编辑对您的应用程序不实用,只要知道ACK延迟是否是问题,就可以指出您正确的方向进行其他解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |