我遇到了一个无法理解的问题。
为了理解它,我编写了一个AS3套接字客户端和一个Python/Twisted服务器。您可以在下面查看两个应用程序的代码。
让我们同时启动两个客户端,将它们排列好以便您可以看到两个窗口,并在两个窗口中按连接按钮。然后按住任何一个按钮。
我期望的是:
按下按钮的客户端向服务器发送一个消息“一些数据”,然后服务器将此消息发送给所有客户端(包括原始发送方)。
然后每个客户端将“connectButton”按钮向右移动,并以以下格式在日志中打印时间的消息:“分:秒:毫秒”。
出现了什么问题:
在发送消息的客户端中,运动是平滑的,但在其他所有客户端中,运动都是不连续的。
这是因为对于那些客户端,消息到达的时间比原始发送方晚。如果我们有三个客户端(让我们称它们为A、B、C),并从A发送一条消息,则B和C的发送时间日志将相同。
为什么其他客户端接收这些消息比原始发送方晚?
顺便说一下,在ubuntu 10.04/chrome上,所有运动都是平滑的。在两个独立的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
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);
}
Python服务器代码。