Передача различных данных клиент-сервер-клиент

Программирование, которое не связано с API.
Ответить
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

Передача различных данных клиент-сервер-клиент

Сообщение Апчхи »

Опору при написании кода делал вот на этот урок: http://flapps.ru/forum/topic7181.html

Теперь про собственно проблему:
Вот так происходит упаковка данных:
 Упаковка кода

Код: Выделить всё

function vidpravka(e:Event):void {    var danniSoket:Object = ({igrok: "Gravec", kordX: гравець.x, kordY: гравець.y});    var otpravka = JSON.stringify(danniSoket);    // массив байт для посылки...    var sendBytes:ByteArray = new ByteArray();                // байты самого сообщения...    var mBytes:ByteArray = new ByteArray();    // запишем сюда строку...    mBytes.writeUTFBytes(otpravka);                // запишем блину сообщения...    sendBytes.writeInt(mBytes.length);    // запишем сам массив байт сообщения...    sendBytes.writeBytes(mBytes);                // отошлем байты...    socket.writeBytes(sendBytes);    socket.flush();}
Файл сокета я взял из урока, заменив только из файла Server.java рядки 62 и 66, вместо message прописал danniSoket; в 158-м рядке Client.java проделал то же.

Код приёма и обработки:
 Обработка и вывод

Код: Выделить всё

function readMessage():void {    // если в буфере меньше длина сообщения, чем нужная длина -     // ждем получения данных...    if(_buffer.length < _buffer.position + _length) return;                // читаем сообщение...    var user_message:String = _buffer.readUTFBytes(_length);                // если в буфере нет данных после считывания сообщения    // и разделителя - очистим его...    // если есть - очистим в следующий раз :)    if(_buffer.bytesAvailable == 0) _buffer.clear();                    // если мы тут - сообщение нормально пришло...    // декодируем сообщения..    var decodedMessage:Object = JSON.parse(user_message);        // теперь выводим сообщение...    var gravOnl:String = decodedMessage.danniSoket.igrok;    var gravOnlkordX:Number = decodedMessage.danniSoket.kordX;    var gravOnlkordY:Number = decodedMessage.danniSoket.kordY;    inf1.text = String(gravOnlkordY);    var pers:Gravec = new Gravec();    pers.x = gravOnlkordX;    pers.y = gravOnlkordY;    addChildAt(pers, 5);                // тут все ок, значит изменим состояние на ожидание длины...    _state = READ_LENGTH;}
И тут собственно ничего не получается - ни объект не создаётся, ни координата не выводиться в текстовое поле. Может что-то заметите или знаете ,что поможет решить проблему. В таком случае прошу помочь и указать на мой промах.
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Передача различных данных клиент-сервер-клиент

Сообщение sasha^ »

ты немного запутался в том что такое JSON :)
клиенту(flash) глубоко наплевать какое имя переменной было у другого клиента...
т.е. обращайся как decodedMessage.igrok
если других ошибок нет то заработает...

ps. приятно знать что мои уроки кому-то пригодились :)
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

Re: Передача различных данных клиент-сервер-клиент

Сообщение Апчхи »

Спасибо за указание, полезно. Но нашел ещё одну неточность, которую не знаю как решить:
Проверяя работоспособность кода с помощью функции

Код: Выделить всё

inf1.text = "+";
обнаружил, что после строки

Код: Выделить всё

var decodedMessage:Object = JSON.parse(user_message); 
проверка не работает. Начал разбираться, и вот к чему дошел:
Если код написан в классе, то он работает и так:

Код: Выделить всё

var decodedMessage:Object = JSON.parse(user_message); 
А вот если написан в кадре (как написал я), то вот как:

Код: Выделить всё

var decodedMessage:Object = JSON.parse(e.target.data); 
Но если я пропишу так как надо, то кол-во аргументов, которые ожидается и полученное, не совпадает, т.е. при вызове функции нужно прописать не readMessage(), а что-то другое. Только вот что? Попробовал некоторые вариации, не получилось, можете подсказать?
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Передача различных данных клиент-сервер-клиент

Сообщение sasha^ »

А вот если написан в кадре (как написал я)
ты так не шути))) код из кадра не имеет доступа к переменным класса.. темболее если есть код в кадре - то не может быть прикреплен класс.. значит в кадре нужно создавать его экземпляр.. и т.д.
сделай в классе и не мути=)
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

Re: Передача различных данных клиент-сервер-клиент

Сообщение Апчхи »

Увы, переделывать в классы - это долго( Можно хотя б наброски, что бы иметь представление, что и как?
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Передача различных данных клиент-сервер-клиент

Сообщение sasha^ »

Увы, переделывать в классы - это долго( Можно хотя б наброски, что бы иметь представление, что и как?
нет..долго.. просто скажу:
1) измени private на public
2) делегируй все задачи классу
Если код написан в классе, то он работает и так:
var decodedMessage:Object = JSON.parse(user_message);

А вот если написан в кадре (как написал я), то вот как:
var decodedMessage:Object = JSON.parse(e.target.data);
потому-что класс имеет доступ к его членам.. кадр - нет, потому он берет данные из цели события(сокета), так можно и в классе сделать, но тогда код запутается. а суть ооп в том чтобы сделать проще...

UPD: как вариант перепиши класс в функции(под кадр) и все будет работать...=))
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

Re: Передача различных данных клиент-сервер-клиент

Сообщение Апчхи »

По второму пунктику хочу сделать уточнение:
все переменные прописать и заполнить данными, файл класса в одной директории из исходником, из кадра обращаться вот так:

Код: Выделить всё

var dopKlass:Main = new Main();var koordinata:Number = dopKlass.decodedMessage.kordX;
Я правильно понял?
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Передача различных данных клиент-сервер-клиент

Сообщение sasha^ »

По второму пунктику хочу сделать уточнение:
все переменные прописать и заполнить данными, файл класса в одной директории из исходником, из кадра обращаться вот так:
нет. не правильно понял.. :)
сделай так чтобы класс или слал событие и подпишись на него из кадра.. или сделай так, чтобы класс вызывал фукнцию-обработчик из кадра... т.е. что-то вроде этого...

Код: Выделить всё

// код класса// тут объявление переменных...public var _messageFunc:Function = null;// тут тоже код класса...private function readMessage():void {//... тут код ф-ции..получаем данные...var decodedMessage:Object = JSON.parse(user_message);// теперь если  есть ф-ция обработчик - передадим в нее...if(_messageFunc != null) _messageFunc(decodedMessage);// тут дальше код ф-ции}// опять код класса... // код в кадреvar obj:Main = new Main();// твоя супер-функция обработки...function myfunc(json:Object):void {trace(json.kordX);}obj._messageFunc = myfunc; 
Ответить