Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Socket и EventDispatcher (http://www.flasher.ru/forum/showthread.php?t=130347)

sadensmol 24.09.2009 10:29

Socket и EventDispatcher
 
Всем привет!
Разбираюсь с As3 - сделал простенькое c-s приложение чат на сокетах.
Проблема в том что при большом колоичестве пакетов с севера - данные на стороне флеша пропадают!
Код AS1/AS2:

                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);
        }

то есть в методе socketData(event:ProgressEvent) я не получаю всех данных приходящих с сервера, хотя сервер их отправляет.
ОС Windows7, Cs4, Flash 10.

Кто нибудь сталкивался с чем то похожим? Почему сокет не диспатчит некоторые данные???

PS: Сейчас посмотрел сниффером - все пакеты реально приходят, а флеш их не видит!!!

dimarik 24.09.2009 12:10

значит, это не UTFBytes

etc 24.09.2009 12:12

Скорее всего строка обрывается по нулевому байту.

sadensmol 24.09.2009 13:26

это 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"}.

Здесь видно что два последовательно идущих пакета разделенный "\0" уже не ловятся...

Пробовал ставить TCP_NODELAY ( без ACK ) - немного лучше ( раза в 2 меньше теряется пакетов )

dimarik 24.09.2009 15:24

Цитата:

Сообщение от sadensmol (Сообщение 853094)
это UTF-8 кодировка с сервера именно в этой кодировке я все и передаю!
В конце каждой строки \0!

Ну дык я о том же.

Код AS3:

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);// АБРАКАДАБРА
        }
}
}

Где Вы видели такой UTFBytes?!

sadensmol 24.09.2009 15:51

Хороший примерчик! Спасибою. Я даже и не думал что все так сложно во флеше.
Код AS3:

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
или попытаться реализовать на сервере отправку одного пакета в одном кадре?

dimarik 24.09.2009 16:08

Вы не поверите! Но я предложу исключить байт \0

sadensmol 24.09.2009 16:19

ммм...
тогда я не понимаю, как я буду разбирать приходящую информацию...
надо придумывать какой то формат и тп...
а сейчас у меня все просто - сериализованные объекты в качестве разделителя \0.

ладно, буду хватать по байтам и искать \0.
Другого варианта абсолютно не вижу (((

Felicast 24.09.2009 17:30

кодируйте base64 (если возможно конечно). размер пакета вырастет на ~30%, зато стопроцентное исключение 0 байта. к тому же base64 хорошо жмется

sadensmol 24.09.2009 19:49

Цитата:

Сообщение от Felicast (Сообщение 853158)
кодируйте base64 (если возможно конечно). размер пакета вырастет на ~30%, зато стопроцентное исключение 0 байта. к тому же base64 хорошо жмется

да почитал, вприницпе неплохое решение.
Но я думаю для простенького прожекта для пакетов вообще без сжатия, это перебор.
Но спасибо. =)


Часовой пояс GMT +4, время: 05:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.