![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Sep 2009
Сообщений: 15
|
Всем привет!
Разбираюсь с As3 - сделал простенькое c-s приложение чат на сокетах. Проблема в том что при большом колоичестве пакетов с севера - данные на стороне флеша пропадают! public function connect() { socket=new Socket(host,port); socket.addEventListener(Event.CONNECT, socketConnect); socket.addEventListener(Event.CLOSE, socketClose); socket.addEventListener(IOErrorEvent.IO_ERROR, socketError); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError); socket.addEventListener(ProgressEvent.SOCKET_DATA, socketData); socket.connect(host, port); } private function socketConnect(event:Event):void { trace("Connected: " + event); } private function socketData(event:ProgressEvent):void { var message : String = socket.readUTFBytes(socket.bytesAvailable); trace("Packet received: " + message); } ОС Windows7, Cs4, Flash 10. Кто нибудь сталкивался с чем то похожим? Почему сокет не диспатчит некоторые данные??? PS: Сейчас посмотрел сниффером - все пакеты реально приходят, а флеш их не видит!!! Последний раз редактировалось sadensmol; 24.09.2009 в 11:12. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Скорее всего строка обрывается по нулевому байту.
|
|
|||||
|
Регистрация: Sep 2009
Сообщений: 15
|
это UTF-8 кодировка с сервера именно в этой кодировке я все и передаю!
В конце каждой строки \0! тоесть логика работы - нашел нулевой байт, сегенерировал событие и передал в него сколько байт считал (event.bytesLoaded)? Теперь приходит сразу же еще один пакет но получается пока из буффера я не вытащу старое новое он не видит? Ничегоне понимаю, кто мне объяснит доходчиво???? Heeeeelp!!! PS: Еще заметил такую вещь что большой пакет при приеме может разбиться на 2! и возникает исключение. Может тут где-то в сокете буфера на прием надо задавать какой? В доках по flash.net.socket ничего такого не нашел PPS: Что удалось узнать дополнительно. Если в отсылку сообщений вставить задержку - минимум 400 мс то все приходит нормально. Каждый пакет приходит в своем сетевом фрейме и Флеш его видит, если же задержку убрать то сообщение вот такого типа ( три пакета в сетевом кадре) уже не разреливаются 0000 00 22 15 da 10 4a 00 0c 6e 8a 2b 3a 08 00 45 00 ."...J.. n.+:..E.
0010 01 5f 5a b2 40 00 80 06 1b 49 c0 a8 01 21 c0 a8 ._Z.@... .I...!..
0020 01 2c 15 b5 d4 e7 d7 02 b5 a0 8f 0c 37 d3 50 18 .,...... ....7.P.
0030 fe 1b 0f c0 00 00 7b 22 69 64 56 4b 22 3a 30 2c ......{" idVK":0,
0040 22 66 69 72 73 74 4e 61 6d 65 22 3a 22 d0 9f d0 "firstNa me":"...
0050 b0 d0 b2 d0 b5 d0 bb 22 2c 22 6c 61 73 74 4e 61 ......." ,"lastNa
0060 6d 65 22 3a 22 2d 2d 2d 22 2c 22 70 61 63 6b 65 me":"--- ","packe
0070 74 4e 61 6d 65 22 3a 22 64 65 72 74 2e 62 61 63 tName":" dert.bac
0080 74 65 72 79 2e 73 65 72 76 65 72 2e 63 68 61 74 tery.ser ver.chat
0090 2e 70 61 63 6b 65 74 73 2e 63 6c 69 65 6e 74 2e .packets .client.
00a0 69 6e 66 6f 2e 43 68 61 74 47 65 74 4f 6e 6c 69 info.Cha tGetOnli
00b0 6e 65 55 73 65 72 73 49 6e 66 6f 52 65 73 70 6f neUsersI nfoRespo
00c0 6e 73 65 50 61 63 6b 65 74 22 7d 00 7b 22 74 65 nsePacke t"}.{"te
00d0 78 74 22 3a 22 32 34 2f 30 39 20 31 33 3a 35 30 xt":"24/ 09 13:50
00e0 20 20 d0 94 d0 b5 d0 bd d0 b8 d1 81 20 5c 22 53 ...... .... \"S
00f0 61 64 65 6e 5c 22 20 d0 a1 d0 b0 d0 b7 d0 be d0 aden\" . ........
0100 bd d0 be d0 b2 20 73 61 79 73 20 3a 20 31 22 2c ..... sa ys : 1",
0110 22 70 61 63 6b 65 74 4e 61 6d 65 22 3a 22 64 65 "packetN ame":"de
0120 72 74 2e 62 61 63 74 65 72 79 2e 73 65 72 76 65 rt.bacte ry.serve
0130 72 2e 63 68 61 74 2e 70 61 63 6b 65 74 73 2e 63 r.chat.p ackets.c
0140 6c 69 65 6e 74 2e 68 69 73 74 6f 72 79 2e 43 68 lient.hi story.Ch
0150 61 74 47 65 74 48 69 73 74 6f 72 79 52 65 73 70 atGetHis toryResp
0160 6f 6e 73 65 50 61 63 6b 65 74 22 7d 00 onsePack et"}.
Пробовал ставить TCP_NODELAY ( без ACK ) - немного лучше ( раза в 2 меньше теряется пакетов ) Последний раз редактировалось iNils; 24.09.2009 в 15:44. |
|
|||||
|
.
|
Цитата:
package { import flash.display.Sprite; import flash.utils.ByteArray; public class TestReadUTF extends Sprite { public function TestReadUTF() { super(); var ba:ByteArray = new ByteArray(); ba.writeUTFBytes('АБРАКАДАБРА'); ba.writeByte(0); ba.writeUTFBytes('ЙЦУКЕН'); ba.position = 0; var str:String = ba.readUTFBytes(ba.bytesAvailable); trace(str);// АБРАКАДАБРА } } } |
|
|||||
|
Регистрация: Sep 2009
Сообщений: 15
|
Хороший примерчик! Спасибою. Я даже и не думал что все так сложно во флеше.
package { import flash.display.Sprite; import flash.utils.ByteArray; public class TestReadUTF extends Sprite { public function TestReadUTF() { super(); var ba:ByteArray = new ByteArray(); ba.writeUTFBytes('АБРАКАДАБРА'); ba.writeByte(0); ba.writeUTFBytes('ЙЦУКЕН'); ba.position = 0; trace(ba);// АБРАКАДАБРА } } } dimarik, не могли бы вы посоветовать как лучше делать в таком случае? Полученное сообщение разбирать побайтово и выделять из него пакеты ( соединять если они разбиты ) -ища постоянно \0 или попытаться реализовать на сервере отправку одного пакета в одном кадре? |
|
|||||
|
Регистрация: Sep 2009
Сообщений: 15
|
ммм...
тогда я не понимаю, как я буду разбирать приходящую информацию... надо придумывать какой то формат и тп... а сейчас у меня все просто - сериализованные объекты в качестве разделителя \0. ладно, буду хватать по байтам и искать \0. Другого варианта абсолютно не вижу ((( |
|
|||||
|
кодируйте base64 (если возможно конечно). размер пакета вырастет на ~30%, зато стопроцентное исключение 0 байта. к тому же base64 хорошо жмется
__________________
я могу стать всем, если только захочу |
|
|||||
|
Регистрация: Sep 2009
Сообщений: 15
|
Цитата:
Но я думаю для простенького прожекта для пакетов вообще без сжатия, это перебор. Но спасибо. =) |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:46. |
|
|
« Предыдущая тема | Следующая тема » |
|
|