![]() |
|
||||||||||
|
|||||
|
Регистрация: May 2006
Адрес: Germany
Сообщений: 74
|
Привет,
мой мувик считывает через сокет от сервера (на Перле) сначала длину UTF строки как unsigned short и потом саму эту строку. Сначала я пытался делать просто: _socket = new Socket(); _socket.addEventListener(ProgressEvent.SOCKET_DATA, handleTcpData); private function handleTcpData(event:Event):void { while (_socket.bytesAvailable) { var str:String = _socket.readUTF(); updateGUI(str); } } Я поискал решения в интернете и похоже что единственный надежный способ - это читать _socket.bytesAvailable байтов в отдельный ByteArray и когда видишь, что там достаточно данных, вычитывать их оттуда нужными методами (типа readUTF, readShort, readObject и т.д.). И вот мой новый код: private function handleTcpData(event:Event):void { var len:uint; if (0 == _socket.bytesAvailable) return; try { _socket.readBytes(_ba, _ba.bytesAvailable, _socket.bytesAvailable); // прочитать длину UTF строки while (_ba.bytesAvailable >= 2) { len = _ba.readUnsignedShort(); if (0 == len) { trace('XXX invalid len = ' + len); _ba.position = 0; _ba.length = 0; return; } // теперь прочитать саму UTF строку if (_ba.bytesAvailable >= len) { var str:String = _ba.readUTFBytes(len); updateGUI(str); // скопировать оставшиеся байты (не работает) var newBA:ByteArray = new ByteArray(); newBA.readBytes(_ba); _ba = newBA; } } } catch(e:Error) { trace('XXX ' + e); _ba.position = 0; _ba.length = 0; return; } } приходят например сразу 2 строки с префиксами. Я добавил пару trace() и вижу что не работает мой код, в котором я пытаюсь убрать из ByteArray те байты, которые я уже обработал: // скопировать оставшиеся байты (не работает) var newBA:ByteArray = new ByteArray(); // здесь newBA.length почему-то 0 newBA.readBytes(_ba); _ba = newBA; Т.е.: если в ByteArray две UTF-строки с префиксами и первую строку я обработал, то как мне ее убрать оттуда? Спасибо Алекс |
|
|||||
|
Modus ponens
|
private function handleTcpData(event:Event):void { var len:uint; var str:String; var newBA:ByteArray; if (!_socket.bytesAvailable) return; try { _socket.readBytes(_ba, _ba.bytesAvailable, _socket.bytesAvailable); // прочитать длину UTF строки while (_ba.bytesAvailable >= 2) { len = _ba.readUnsignedShort(); if (!len) { trace("XXX invalid len = " + len); _ba.position = 0; _ba.length = 0; return; } // теперь прочитать саму UTF строку if (_ba.bytesAvailable >= len) { str = _ba.readUTFBytes(len); updateGUI(str); // скопировать оставшиеся байты (не работает) newBA = new ByteArray(); if (_ba.bytesAvailable) newBA.readBytes(_ba, 0, _ba.bytesAvailable); _ba = newBA; } else { // Ну вот вы и не прочитали неокончившуюся строку, а что теперь? } } } catch (e:Error) { trace('XXX ' + e); _ba.position = 0; _ba.length = 0; return; } }
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: May 2006
Адрес: Germany
Сообщений: 74
|
Нашел ответ, я копировал байты не в ту сторону, надо так:
Цитата:
пока Алекс |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Не забывайте, что данные могут прийти не полностью за один проход.
|
|
|||||
|
а почему могут прийти не полностью?
(вопрос тож актуален)
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
Modus ponens
|
Да, но вот только вы уже прочитали к тому времени длину строки, и позиция в вашем "буфере" уже перешла дальше, т.е. вы будете читать первые 2 байта еще раз (а там уже будет начало новой строки вместо ее длины).
__________________
Hell is the possibility of sanity |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Есть такая штука, называется «пакеты». Размер оного регламентируется настройками сети и прочими параметрами. Так вот входящий поток будет разбит на эти пакеты.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 17:26. |
|
|
« Предыдущая тема | Следующая тема » |
|
|