TCP 套接字帧'queuing'在 Windows 上。如何强制将每条消息置于其自己的帧中?



我使用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标志),但如果有,您可以尝试这样做。

相关内容

  • 没有找到相关文章

最新更新