Четверг, 18 Апреля 2024, 19:52

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Adobe Flash и Создание флэш-игр » ByteArray (И с чем его едят)
ByteArray
FenrireДата: Среда, 21 Декабря 2011, 15:48 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Всем привет!
Столкнулся с такой вот проблемкой. Нигде не найду как обработать ответ от сервера.
В общем, ситуация следующая:

есть клиент и эхо сервер.

я отправляю на сервер некие данные, разбив их на нужное количество байт.
Разбивка происходит следующей функцией:


Сервер принимает и расшифровывает все корректно. После чего он отправляет полученное сообщение обратно.

И вот тут-то и начинаются проблемы.

В общем, что делаю я -
в событии DataEvent.DATA, подписанном на сокет:

Code

private function dataHandler(event:DataEvent):void {
       
     var ba:ByteArray = new ByteArray();
     ba.writeUTFBytes(event.data);
       
     var str:String = ba.readUTFBytes(ba.length);
       
     trace(str);
       
    }


получаю следующую ошибку:
Error: Error #2030: Обнаружен конец файла.

полный текст.


пробовал потрейсить массив. Имеем следующее:

Code
trace(ba.length); //0,1,3,3,2

Code
trace(ba.bytesAvailable); // 0,0,0,0,0


Где я что не так делаю, подскажите пожалуйста.
Спасибо.


Сообщение отредактировал Fenrire - Среда, 21 Декабря 2011, 15:50
SoWaДата: Среда, 21 Декабря 2011, 19:20 | Сообщение # 2
частый гость
Сейчас нет на сайте
Quote (Fenrire)
trace(ba.length); //0,1,3,3,2

А как ты превратил int в массив? length ведь длину возвращает...

А проблема твоя в указателе на позицию в массиве. ba.position = 0;


ActionScript-программист. Так же Flash Media Server, C#, PHP. Рисовать не умею и не люблю.
Ищу проект, желательно где есть грамотный менеджер, дизайнер и художник.
FenrireДата: Среда, 21 Декабря 2011, 20:07 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Quote (SoWa)
А как ты превратил int в массив? length ведь длину возвращает...


Если честно, я понятия не имею, трейсил чистую дату из события - тоже массивом идет.
0x90Дата: Среда, 21 Декабря 2011, 21:34 | Сообщение # 4
участник
Сейчас нет на сайте
Ребята, покажите как будет выглядеть следующий код во флэш:
Code

GetDword(char *buffer, DWORD offset)
{
   DWORD temp;
   temp = buffer[offset];
   temp <<= 8;
   temp |= buffer[offset+1];
   temp <<= 8;
   temp |= buffer[offset+2];
   temp <<= 8;
   temp |= buffer[offset+3];

   return temp;
}

char buffer[size];
recv(sock, buffer, sizeof(buff), 0));
DWORD n = GetDword(buffer,0);


Сообщение отредактировал 0x90 - Среда, 21 Декабря 2011, 21:53
noTformaTДата: Среда, 21 Декабря 2011, 22:51 | Сообщение # 5
Ukrainian independent game developer
Сейчас нет на сайте
Quote (Fenrire)
var ba:ByteArray = new ByteArray();
     ba.writeUTFBytes(event.data);
       
     var str:String = ba.readUTFBytes(ba.length);

event.data это сетер/геттер вытягивающий объект класса String.

Вот теперь я нифига не понял. Ты сначала получаешь строку event.data, запихиваешь ее в байтАррай, потом из байтАррая получаешь строку обратно?

0x90,
1) БайтАррай и ДаблВорлд это как бы разные вещи...

В классе ByteArray предусмотрены методы и свойства для оптимизации чтения и записи двоичных данных, а также работы с ними.

В прямом смысле это объектная обертка массива байт.

2) Работа с сокетом во флеше примитивна.
чет типа
var mySock:Socket = new Socket("http://gcup.ru", 8080);
// тут проверки на наличие данных в потоке
//....
var read_int:int = mySock.readByte(); //Считывает из потока байт со знаком.
var read_bool:Boolean = mySock.readBoolean(); //Считывает из потока логическое значение

ну, а то что тебе надо:

Socket.readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void - считывает БайтАррэй, с определенным оффсетом и длиной...

Дальше крути верти объект класса БайтАррей операторами [], <<, |.


@noTformaT
0x90Дата: Среда, 21 Декабря 2011, 23:41 | Сообщение # 6
участник
Сейчас нет на сайте
Quote (noTformaT)
1) БайтАррай и ДаблВорлд это как бы разные вещи...

Я в курсе. Я рассматривал БайтАррай как тот же char*. Суть поста была в том, чтобы мне объяснили, как запихнуть четыре байта из массива в дворд(инт в случае флэша) учитывая особенности little-endian. Вопрос более не актуален, всем спасибо.
noTformaTДата: Четверг, 22 Декабря 2011, 00:12 | Сообщение # 7
Ukrainian independent game developer
Сейчас нет на сайте
Quote (0x90)
как запихнуть четыре байта из массива в дворд(инт в случае флэша) учитывая особенности little-endian.

инт во флеше это объект. Как бы это странно не звучало, но это смешно..
При этом есть 4 метода, и 2 статичные константы.
Поэтому верный следующий код
var a:Object = 21;
21.toString();
Второй способ кажись прикрыли адоб....

В ас3 все - объекты, будь-то строки, числа, регулярки, и т.д. Есть базовый public dynamic class Object (публичный динамический класс (мне кажется это понятие есть только в АКМАСкриптах)), от которого идут все классы.

Причем сам public dynamic class Object, очень стремный.

var myObj:Object = {x:20, y:40}; //получили объект с двумя свойствами х и у.
myObj["myFunc"] = function (){ return 10}; //добавили к объекту свойство myFunc, и присвоили ему анонимную функцию
myObj.myFunc(); // вызвали функцию..

Во флеше куча всяких стремных фишек, от чего код становится нереально стремным.. Например есть тип данных * - ссылка на хоть что-то. Есть тип данных неймспейсы (это еще смешнее), которые братья Классов, и понять зачем неймспейсы вообще нужны никто не может. а есть еще неймспейсы хмл структур и т.д.

К счастью я отношусь к школе ас3 программеров не использующие динамические свойства языка и класс Object .

В ас3 все все все объектное, это даже наводит печаль...
Да, не объектных типов данных в ас3 нет..


@noTformaT
FenrireДата: Четверг, 22 Декабря 2011, 14:51 | Сообщение # 8
почетный гость
Сейчас нет на сайте
Проблему вроде как решил.
Собственно, заключалась она в том, что использовал я XMLSocket
А он, по словам товарисча SoWa:
Quote

По XML-сокету передаются конвертированные в валидный XML формат
Т.е. вся байт-структура рушится нафиг smile


Переделал под простой Socket, начались сдвиги.

Так же, отдельное спасибо noTformaT! ))
За подачу идеи.
Попробовал отправлять на сервер объект с заданными параметрами.
Выходит правда, вместо 12 байт 32, но за то все классифицировано.
И так же принимать и считывать объект из сокета гораздо приятней.

Всем спасибо за отзывы!
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Adobe Flash и Создание флэш-игр » ByteArray (И с чем его едят)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг