我使用Actionscript 3 TCP套接字与Javascript websockets连接。发送数据主要是从websocket到AS socket。
在Mac OS X上,没有问题。然而,在Windows上,连续的TCP消息似乎在某处排队。这将导致ProgressEvent.SOCKET_DATA
事件以相当长的时间间隔触发,从而产生明显的延迟。
我使用Wireshark来监控OS X和Windows上的TCP数据包。我看到的不同之处在于,在OS X上,每个消息都在它自己的数据包中,而在Windows上,连续的消息被"连接"到一个数据包中。
这只是套接字实现的方式,还是有任何方法我可以改进这一点?
编辑1:我在actionscript.org上发现了这篇文章,它概述了同样的问题
编辑2:我找到了一个解决问题的方法。我用虚拟文本填充每条消息以增加帧大小。这导致TCP栈在它自己的帧中发送每条消息,而不是将它们排队。这是有效的,即使它真的,真的很丑…
这是SOCKET_DATA
事件中的代码。
while(this.socket.bytesAvailable) {
var byte:uint = this.socket.readUnsignedByte();
if(byte == 0x00) {
trace("Start byte found. - " + new Date().time);
this.incomingMessageBytes = new ByteArray();
} else if (byte == 0xFF) {
trace("End byte found. Dispatching. - " + new Date().time);
this.incomingMessageBytes.position = 0;
var msg:String = incomingMessageBytes.readUTFBytes(incomingMessageBytes.bytesAvailable);
var decodedMessage:Object = JSON.decode(msg, false);
var message = new Message(decodedMessage.clientId, decodedMessage.command, decodedMessage.data);
this.dispatchEvent(new MessageReceivedEvent(MessageReceivedEvent.RECEIVED_MESSAGE, message));
} else {
//trace("Appending.");
this.incomingMessageBytes.writeByte(byte);
}
}
听起来你可能看到了Nagle算法的效果。我不知道是否有一种方法可以在ActionScript下禁用Nagle的算法(又名设置TCP_NODELAY标志),但如果有,您可以尝试这样做。