Всем привет! Столкнулся с такой вот проблемкой. Нигде не найду как обработать ответ от сервера. В общем, ситуация следующая:
есть клиент и эхо сервер.
я отправляю на сервер некие данные, разбив их на нужное количество байт. Разбивка происходит следующей функцией:
Code
public function intToByte(start:Object, control:Object, end:Object):ByteArray { // массивы байт var ba:ByteArray = new ByteArray();
//укладываем по байтам в сообщение для отправки ba.writeShort(start.x); ba.writeShort(start.y); ba.writeShort(control.x); ba.writeShort(control.y); ba.writeShort(end.x); ba.writeShort(end.y);
return ba; }
Сервер принимает и расшифровывает все корректно. После чего он отправляет полученное сообщение обратно.
И вот тут-то и начинаются проблемы.
В общем, что делаю я - в событии 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: Обнаружен конец файла.
полный текст.
Error: Error #2030: Обнаружен конец файла. at flash.utils::ByteArray/readUTFBytes() at Main/dataHandler() at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::XMLSocket/scanAndSendEvent()
пробовал потрейсить массив. Имеем следующее:
Code
trace(ba.length); //0,1,3,3,2
Code
trace(ba.bytesAvailable); // 0,0,0,0,0
Где я что не так делаю, подскажите пожалуйста. Спасибо.
Сообщение отредактировал Fenrire - Среда, 21 Декабря 2011, 15:50
А как ты превратил int в массив? length ведь длину возвращает...
А проблема твоя в указателе на позицию в массиве. ba.position = 0; ActionScript-программист. Так же Flash Media Server, C#, PHP. Рисовать не умею и не люблю. Ищу проект, желательно где есть грамотный менеджер, дизайнер и художник.
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
1) БайтАррай и ДаблВорлд это как бы разные вещи...
Я в курсе. Я рассматривал БайтАррай как тот же char*. Суть поста была в том, чтобы мне объяснили, как запихнуть четыре байта из массива в дворд(инт в случае флэша) учитывая особенности little-endian. Вопрос более не актуален, всем спасибо.
как запихнуть четыре байта из массива в дворд(инт в случае флэша) учитывая особенности 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
Проблему вроде как решил. Собственно, заключалась она в том, что использовал я XMLSocket А он, по словам товарисча SoWa:
Quote
По XML-сокету передаются конвертированные в валидный XML формат Т.е. вся байт-структура рушится нафиг
Переделал под простой Socket, начались сдвиги.
Так же, отдельное спасибо noTformaT! )) За подачу идеи. Попробовал отправлять на сервер объект с заданными параметрами. Выходит правда, вместо 12 байт 32, но за то все классифицировано. И так же принимать и считывать объект из сокета гораздо приятней.