Я использую 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);
}
}