Цитата:
|
Я прошу прощения за назойливость, но что "это"? Если мы говорим о TCP-соединении, то именно так оно и работает. То, что не помещается в один пакет, делится на несколько пакетов поменьше, последний из которых получает "приписку" (флаг PSH), которая указывает на конец последовательности.
|
=) это никоем образом не относится к описываемой проблеме.
Вот если на пальцах.
1) есть N байт (допустим 65кб) которые нам надо переслать
2) на сервере указываем размер отсылаемого буфера в 1000 байт.
3) пишем наш пакет данных в сокет и отправляем. write() && flush(); Понятное дело что сервак начнёт слать пакет порциями по 1000байт.
4) во флешке отрабатывает ProgressEvent, на сокет появляются данные - bytesAvaiable. Причём не факт что там будет 1000байт, там будет точно не больше 1000. Данные эти обязательно нужно считать, иначе сокет засрётся.
5) ProgressEvent отработает ровно такое кол-во раз, сколько нужно для пересылки наших 65кб. В идеале 65kb/1000b раз.
6) Флеш пока не получит по кусочкам все эти 65кб, будет тормозить (забивать CPU процедурой заполнения сокета принимаемыми данными)
Соответственно, если мы пошлём 1кб, то ничего не заметим, всё пройдёт быстро и безболезненно, если 65 - то всё повиснет. Значит надо посылать по 1кб 65 раз =) тобишь 65 раз сделать socket.wirte() и socket.flush(); причём после подтверждения от флеша - мол готов к новой порции.
Это реально работает и не тормозит, но пересылка данных занимает много времени.
Последнее - это лирика на самом деле.
В том же c# или java конечно же такой проблемы нет.