Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 奇怪的flashas3xml套接字行为_Actionscript 3_Flash_Networking - Fatal编程技术网

Actionscript 3 奇怪的flashas3xml套接字行为

Actionscript 3 奇怪的flashas3xml套接字行为,actionscript-3,flash,networking,Actionscript 3,Flash,Networking,我有一个我不能理解的问题 为了理解它,我在AS3上编写了一个套接字客户机,在python/twisted上编写了一个服务器,您可以在下面看到这两个应用程序的代码 让我们同时启动两个,对它们进行排列,以便您可以同时看到两个窗口,并在两个窗口中按下连接按钮。然后按住任意按钮 我所期待的: 按下按钮的客户端向服务器发送一条消息“一些数据”,然后服务器将此消息发送给所有客户端(包括原始发送方) 然后,每个客户端向右移动按钮“connectButton”,并以以下格式向日志打印一条带有时间的消息:“分钟:

我有一个我不能理解的问题

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

让我们同时启动两个,对它们进行排列,以便您可以同时看到两个窗口,并在两个窗口中按下连接按钮。然后按住任意按钮

我所期待的:

按下按钮的客户端向服务器发送一条消息“一些数据”,然后服务器将此消息发送给所有客户端(包括原始发送方)

然后,每个客户端向右移动按钮“connectButton”,并以以下格式向日志打印一条带有时间的消息:“分钟:秒:毫秒”

出了什么问题:

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

这是因为发送给这些客户端的消息比发送给原始客户端的消息要晚。如果我们有三个客户端(让我们把它们命名为A、B、C),并且我们从A发送消息,那么B和C的发送时间日志将是相同的

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

顺便说一下,在ubuntu 10.04/chrome上,所有的动作都是平滑的。两个客户机分别以不同的色度启动

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

[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

.

我知道这有点晚,但很可能是因为在服务器和未启动的客户端之间建立TCP连接需要时间

其想法是,在发起客户端和服务器之间已经建立了TCP连接(在第一个客户端的消息之前就建立了TCP连接),因此在这种情况下,执行三方握手所需的时间就被消除了

您可以通过几种方法对此进行测试,最简单的方法是在处理真正的消息之前建立连接(例如,向每个消息发送一条虚拟消息)

如果不想与每个客户机建立连接,也可以切换到UDP,但这样会失去TCP的可靠性


我不确定我是否理解你关于Linux的说明。你是说它可以在Linux上正常工作,但不能在Windows上正常工作?如果是这样,我们需要更多地了解您的设置,例如,所有客户端是否都在同一台主机上运行?在同一浏览器实例中?

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

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


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

还不晚,谢谢。在数据发送之前已建立连接。我可以通过打开两个客户端(问题开头的链接)来检查它,并与它们一起玩。是的,它在linux上按我的预期工作。同一个主机,同一个Flash播放器作为客户端,两者都使用chrome。这只是一个想法,但我的印象是,如果SWF对象在HTML中没有焦点,它将以较低的帧速率运行。这可以解释为什么会出现“斩波”,不过在ubuntu/chrome上运行得很好,这可能是因为安装程序中的flash播放器处理它的方式不同。您是否在不同的机器上尝试过,而不仅仅是在同一台机器上?我模模糊糊地记得读到过这样一篇文章:速度可以大幅下降到2 fps左右。谢谢你,我用ubuntu试了2台不同的机器,用widnows试了4台,都是一样的。当我在两台不同的机器上运行两个客户机(所有客户机都有一个焦点)时,客户机的等待数据会有起伏的运动和错误的时间日志(就像我在下面的问题中发布的那样)。天哪,它似乎可以工作!我在twissted服务器上的ConnectionMode方法中设置了self.transport.setTcpNoDelay(True)。
        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);
        }