奇怪的Flash AS3 xml套接字行为

Rnd*_*d_d 6 flash networking actionscript-3

我有一个我无法理解的问题.

为了理解它,我在AS3上编写了一个套接字客户端,在python/twisted上编写了一个服务器,你可以在下面看到这两个应用程序的代码.

让我们同时启动两个客户端,安排它们,以便您可以在两个窗口中看到两个窗口并按下连接按钮.然后按住任何按钮.

我期待的是:

按下按钮的客户端向服务器发送消息"某些数据",然后服务器将此消息发送给所有客户端(包括原始发件人).

然后每个客户端向右移动按钮'connectButton'并按照以下格式随时间向日志打印消息:"min:secs:milliseconds".

出了什么问题:

在发送消息的客户端中运动是平滑的,但在所有其他客户端中,运动是不稳定的.

发生这种情况是因为发送给这些客户端的邮件的时间晚于原始发送客户端 如果我们有三个客户端(让我们将它们命名为A,B,C)并且我们从A发送消息,则B和C的发送时间日志将是相同的.

为什么其他客户端比原始发件人晚收到此邮件?

顺便说一句,在ubuntu 10.04/chrome上,所有动作都很流畅.两个客户在分开的chromes中推出.

Windows截图

linux截图

日志列表,同时列出四个客户端:

[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
Run Code Online (Sandbox Code Playgroud)

AS3客户端代码,我只留下相关部分,完整代码在这里.

        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);
        }
Run Code Online (Sandbox Code Playgroud)

Python服务器代码.

Set*_*ble 4

您可能会遇到ACK 延迟和/或Nagle 算法的某种组合。这两种方法都可以有选择地延迟 TCP 会话上的数据移动,并且它们的实现因平台而异。

尝试在套接字上使用setsockopt()with来禁用 Nagle。TCP_NODELAY

AFIK,Windows 不允许您在每个套接字的基础上禁用 ACK 延迟:您必须编辑注册表并为所有 TCP 禁用它。所以TCP_NODELAY先尝试一下。如果这不起作用,请尝试禁用 ACK 延迟。即使注册表编辑对您的应用程序不实用,只要知道 ACK 延迟是否是问题所在,就可以为您指明其他解决方法的正确方向。