Показать сообщение отдельно
Старый 13.02.2012, 21:08
VInchensoo вне форума Посмотреть профиль Отправить личное сообщение для VInchensoo Найти все сообщения от VInchensoo
  № 4  
Ответить с цитированием
VInchensoo

Регистрация: Jan 2012
Сообщений: 9
Цитата:
Никто не гарантирует, что даныне придут "пакетом". И в протоколе обмена нет понятия "порция" данных. Причин, по которым могут изменяться "размеры" получаемого блока данных - масса. Поэтому нужно правильно разбирать поток.
Я и пытаюсь его поэтому разбирать, а не тупо читать при проверке. Но, во-первых, как-то странно, что пакет рвется, когда он имеет размер ~20 байт. Я понял бы, если 20кб, но не байт же.

Причем на сервер все приходит сразу, там такой ошибки нет, эксепшина не было ни разу за время тестов.

В любом случае, я поставил проверку, которая в теории должна работать, чтобы не читать данные, пока они не пришли до конца.
Функции проверки буфера на непустоту я тоже не особо нашел.
Цитата:
Ну так может все данные уже пришли при втором вызове функции, откуда он третий раз будет вызываться?
Нет, судя по трассировщику данные не пришли(выводил значение bytesLoaded). Либо я не правильно понимаю, что храниться в bytesLoaded.
Цитата:
Вот это вот в общем случае неправильно. Данных может быть больше, чем вы считали в предыдущий раз (два сообщения подряд).
Вот этот момент я не особо понял. То, что я считываю- записано руками на сервере. Откуда данных будет больше? Это же не цпп с его низкоуровневой сетью, в bytesLoaded не должен учитываться заголовок пакета и прочий "системный трафик", который специфичен именно для реализации TCP.

Что вы подразумеваете под тем, что данных может быть больше?
Цитата:
Кстати, а bytesLoaded изменяется в следующем событии при чтении данных или нет? Просто либо при чтении следуюшей порции вы не получите правильных bytesLoaded (потому что считали уже один байт), либо не прочитаете вторую "порцию" информации (потому что bytesLoaded для нее будет суммой длин двух записей, а не длиной второй записи).
Ну вообще оно меняется, только я не смог понять, как именно. Обычно в консоль IDE выдается 2 строчки, первый раз грузит 4-5, потом может 9, может 11, когда как(байт).

Я пытался проверять оба способа, с учетом того, что от bytesLoaded отнимается 1 байт, когда мы считываем из буфера, и с учетом того, что этот байт не отнимается. Все тот же великий рандом наблюдается.

Вообще, официальная документация adobe как-то крайней скупо поясняет, что такое bytesLoaded, и как его готовить.

Я считал, что это число загруженных байт, которое не меняется, т.е. во время первой проверки считано 7 байт, во время второй 11, значит вторая часть- 4 байта. Еще 1 не дошел(ну это в данном случае).

Другого способа(человечного) проверить, что данные пришли, и пришло именно столько, сколько нужно- я не нашел. Проверки на пустоту буфера я тоже не нашел.

Может вы можете подсказать, как это вся правильно организовать именно на флеше, может с какими-то пруфами\примерами кодов. Буду премного благодарен.
Цитата:
где-то и когда-то говорили, что флеш(не air) с UDP не работает, а тока с TCP.
А так как Вы используете в сервере подключение через UDP, возможно в этом трабл.(т.к UDP у Вас будет слать пакеты, а дошли они или нет их уже не волнует)
На сервере используется ТСР, как и в клиенте.


Последний раз редактировалось VInchensoo; 13.02.2012 в 21:27. Причина: Тег поправил