Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.09.2009, 10:29
sadensmol вне форума Посмотреть профиль Отправить личное сообщение для sadensmol Найти все сообщения от sadensmol
  № 1  
Ответить с цитированием
sadensmol

Регистрация: Sep 2009
Сообщений: 15
По умолчанию 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: Сейчас посмотрел сниффером - все пакеты реально приходят, а флеш их не видит!!!


Последний раз редактировалось sadensmol; 24.09.2009 в 11:12.
Старый 24.09.2009, 12:10
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
значит, это не UTFBytes
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 24.09.2009, 12:12
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Скорее всего строка обрывается по нулевому байту.

Старый 24.09.2009, 13:26
sadensmol вне форума Посмотреть профиль Отправить личное сообщение для sadensmol Найти все сообщения от sadensmol
  № 4  
Ответить с цитированием
sadensmol

Регистрация: 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"}.
Здесь видно что два последовательно идущих пакета разделенный "\0" уже не ловятся...

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


Последний раз редактировалось iNils; 24.09.2009 в 15:44.
Старый 24.09.2009, 15:24
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 5  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от sadensmol Посмотреть сообщение
это 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?!
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 24.09.2009, 15:51
sadensmol вне форума Посмотреть профиль Отправить личное сообщение для sadensmol Найти все сообщения от sadensmol
  № 6  
Ответить с цитированием
sadensmol

Регистрация: Sep 2009
Сообщений: 15
Хороший примерчик! Спасибою. Я даже и не думал что все так сложно во флеше.
Код 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
или попытаться реализовать на сервере отправку одного пакета в одном кадре?

Старый 24.09.2009, 16:08
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 7  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Вы не поверите! Но я предложу исключить байт \0
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 24.09.2009, 16:19
sadensmol вне форума Посмотреть профиль Отправить личное сообщение для sadensmol Найти все сообщения от sadensmol
  № 8  
Ответить с цитированием
sadensmol

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

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

Старый 24.09.2009, 17:30
Felicast вне форума Посмотреть профиль Отправить личное сообщение для Felicast Найти все сообщения от Felicast
  № 9  
Ответить с цитированием
Felicast
 
Аватар для Felicast

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
кодируйте base64 (если возможно конечно). размер пакета вырастет на ~30%, зато стопроцентное исключение 0 байта. к тому же base64 хорошо жмется
__________________
я могу стать всем, если только захочу

Старый 24.09.2009, 19:49
sadensmol вне форума Посмотреть профиль Отправить личное сообщение для sadensmol Найти все сообщения от sadensmol
  № 10  
Ответить с цитированием
sadensmol

Регистрация: Sep 2009
Сообщений: 15
Цитата:
Сообщение от Felicast Посмотреть сообщение
кодируйте base64 (если возможно конечно). размер пакета вырастет на ~30%, зато стопроцентное исключение 0 байта. к тому же base64 хорошо жмется
да почитал, вприницпе неплохое решение.
Но я думаю для простенького прожекта для пакетов вообще без сжатия, это перебор.
Но спасибо. =)

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:46.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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