Фреймы TCP Socket в очереди в Windows. Как я могу заставить каждое сообщение в своем собственном кадре? - PullRequest
0 голосов
/ 12 сентября 2011

Я использую TCP-сокеты Actionscript 3 для соединения с веб-сокетами Javascript.Отправка данных происходит в основном из веб-сокета в сокет AS.

В Mac OS X проблем нет.В Windows, однако, последовательные сообщения TCP, похоже, стоят где-то в очереди.Это приводит к возникновению события ProgressEvent.SOCKET_DATA с довольно большим интервалом времени, что создает заметную задержку.

Я использовал Wireshark для мониторинга пакетов TCP как в OS X, так и в Windows.Различие, которое я вижу, состоит в том, что в 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);
    }
}

1 Ответ

2 голосов
/ 19 сентября 2011

Похоже, вы могли видеть эффекты алгоритма Нейгла.Я не знаю, есть ли способ отключить алгоритм Nagle (он же устанавливает флаг TCP_NODELAY) в ActionScript, но если есть, вы можете попробовать это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...