![]() |
|
||||||||||
|
|||||
|
Регистрация: Jan 2011
Сообщений: 6
|
Народ есть проблема - socket теряет сообщения от сервака.
public function send(str:String):void { str += ";\n"; socket.writeUTFBytes(str); socket.flush(); trace("Серверу: ",str) } private function readResponse():void { var i,j,k:int inp_str = socket.readUTFBytes(socket.bytesAvailable); trace("Сервер:",inp_str) ... } функцией send шлются строки примерно в 70 символов раз в 120 мс. При тыке мышкой шлется дополнительная строка (единожды) тем же оъемом. На сервер все доходит, обрабатывается и уходит ответ, но почему-то не доходит до флешки (как раз тот самый ответ на событие мыши). Вернее, иногда получается, что ответ доходит, а иногда - нет (50 на 50). Если кто-то сталкивался с подобной проблемой, или есть соображения по этому поводу, то было бы интересно узнать Ваше мнение по поводу решения этой проблемы. |
|
|||||
|
Не знаю, когда у вас вызывается функция readResponse(), но судя по сигнатуре, не в ответ на какое-либо событие. Попробуйте подписаться на событие ProgressEvent.SOCKET_DATA.
|
|
|||||
|
Регистрация: Jan 2011
Сообщений: 6
|
Цитата:
|
|
|||||
|
Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
|
а само событие вызывается или нет? может не во флеше проблема
__________________
low + |
|
|||||
|
Modus ponens
|
Если в строке есть нуль-байты, то в консоль будет выводиться только до первого такого байта.
А за такие названия переменных я бы руки по самые уши бы отрывал ![]()
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Jan 2011
Сообщений: 6
|
Цитата:
Цитата:
З.Ы. не надо мне руки отрывать пригодятся еще ![]() |
|
|||||
|
Регистрация: Jan 2011
Сообщений: 6
|
wvxvw, спасибо за подсказку
![]() Появилось подозрение, что сообщения не успевают считываться. Т.е. если одновременно приходит 2 сообщения, и они записываются в байтэррэй сокета (в конце каждого стоит нуль-байт "/x00"), то получается, я могу считать первое сообщение, а остальные пропадают? Как думаете, такое возможно? И еще, кто-нибудь может подсказать, как считать из ByteArray данные, оказавшиеся за нуль-байтом? Добавлено через 43 минуты Исхитрился-таки Нашел способ считать инфу за нуль-байтом!var st1:String="c\x00def\x00ghi" var ba:ByteArray= new ByteArray() ba.writeUTFBytes(st1) var result_str:String="" ba.position=0 do{ result_str+=ba.readUTFBytes(ba.bytesAvailable)+"|" ba.position=result_str.length trace(result_str) }while(ba.bytesAvailable!=0) Цитата:
Ладно, буду проверять гипотезу о склеивании пришедших сообщений ![]() |
|
|||||
|
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
ну как, в чем дело было?
|
|
|||||
|
Сокетное соединение не гарантирует того, что ваши сообщения придут именно такими кусками, как вы их отправили.
То есть, если на сервере вы сделали два раза flush(), то это вовсе не значит, что будет именно два события SOCKET_DATA на клиенте. Если передаваемый кусок данных большой, например видео или картинка, то событий будет куча. А если отправить два мелких сообщения подряд они могут прийти на одно событие. Выход такой -- складываем все пришедшие байты по SOCKET_DATA в буфер, потом анализируем на конец и начало сообщения. То есть есть ли там ЦЕЛОЕ сообщение, если есть -- вычитываем его и обновляем буфер. То есть, например, послали три сообщения, а пришли они в два куска. Считываем полтора с сокета, записываем их в буфер, вычитываем первое из буфера и стираем, оставляя там половину. А со следующего события это все склеивается в буфере и вычитывается. И никаких потерь. Возможно, придется написать некий свой протокол передачи данных. Я использовал определенный формат сообщений. Без символов конца, а с символом начала, кажется, и указанием полной длины сообщения, указанием длины ключа, ключом, указанием длины только лишь передаваемой полезной информации и собственно информации. Что-то в этом роде. Извините, если немного не в тему. Последний раз редактировалось ChuwY; 20.01.2011 в 03:57. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:48. |
|
|
« Предыдущая тема | Следующая тема » |
|
|